String str1 = new String("123");
String str2 = "123";
package testString;
public class testString
{
public static void main(String[] args)
{
String a = "123";
String b = "123";
System.out.println(a==b);
System.out.println(a.equals(b));
System.out.println("------------------------------------------");
/**
* true
* true
* 此处创建一个字符串"123"储存在常量池中
* 因为"123"储存在常量区,并且唯一,即两个String引用a和b所的地址相同所以a==b为true
* 并且两个引用在所指对象在堆中的内容相同所以a.equals(b)为true
*/
String c = new String("1234");
String d = new String("1234");
System.out.println(c==d);
System.out.println(c.equals(d));
System.out.println("------------------------------------------");
/*
* false
* true
* 此处创建三个字符串“1234”,一个在常量池中,两个通过new储存在堆中
* 因为c和d此时指向的是堆中的两个String对象,所以地址不同 c==d为false
* 但是c与d堆中内容相同所以c.equals(d)为true
*/
String e = "a1";
String f = "a"+1;
System.out.println(e==f);
System.out.println(e.equals(f));
System.out.println("------------------------------------------");
/**
* true
* true
* 此处创建“a1”“a”2个字符串其中“a1”“a”他们两个均在常量池中,你可能会问+是个运算符重载么?
* 是的,java自己有一定的运算符重载但是你没法使用定义自己的运算符重载,和c++不同,String f = "a"+1;
* 这句会被编译器做成 String f=“a1”;这与我们讲到的第一种情况相同,不再赘述。
* 编译器之所以这么做是因为他在编译时就能够确定
*/
String g = "gh";
String hh = "h";
String h = "g" + hh ;
System.out.println(g==h);
System.out.println(g.equals(h));
System.out.println("------------------------------------------");
/**
* false
* true
* 与上面不同的是这里的h在编译时不能确定(编译器是这样认为的),所以h所指的对象在运行时确定储存在堆中,
* 所以g==h为true而g.equals(h)为false
*/
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有