String str1 = "dx";
String str2 = new String("dx");
String str4 = "d";
String str5 = "x";
String str3 = str4+str5;
final String str6 = "d";
String str7 = str6 + "x";
String str8 = "d" + "x";
System.out.println(str1 == str2.intern());//true
System.out.println(str1==str3);//false
System.out.println(str1==str7);//true
System.out.println(str7==str8);//true各位大牛能帮我解释下这个结果的原因吗?
String str2 = new String("dx");
String str4 = "d";
String str5 = "x";
String str3 = str4+str5;
final String str6 = "d";
String str7 = str6 + "x";
String str8 = "d" + "x";
System.out.println(str1 == str2.intern());//true
System.out.println(str1==str3);//false
System.out.println(str1==str7);//true
System.out.println(str7==str8);//true各位大牛能帮我解释下这个结果的原因吗?
直接赋值的如String s="dx",这样的对象放在常量池中,编译过程中就能够识别,new出来的的放在堆内存中,执行期再分配新的内存,所以str1和str2不是同一对象。而intern函数具体可以自己查一下api文档,大概是从常量池中找有没有相等的对象,这里的相等时用equals来判断。有就用,没有就在池里新创建,显然str2的对象在常量池中能找到,所以是用的同一对象。str1=str2。str4和str5在编译期是不能识别的,得执行中动态分配新的内存,所以和指向常量池中的对象的str1不==。str6则是因为加了final,对于final修饰的变量,它在编译时被解析为常量值的一个本地拷贝存储到自己的常量池中或嵌入到它的字节码流中。简单点来理解加了final时str7等效于str7="d"+"x",也等效于str7="dx";