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各位大牛能帮我解释下这个结果的原因吗?

解决方案 »

  1.   

    关于Java中String的问题,可以说一百度可以搜出好几页。 为什么不肯自己查一下列?搜索一下String 常量池
      

  2.   

    看看这个吧。http://hi.baidu.com/xianminvip/item/44ecbe8d83b6fdcab071544d
      

  3.   

    http://bbs.csdn.net/topics/390085548http://bbs.csdn.net/topics/390292076
      

  4.   

    String的==比较的是两者是否同一对象。
    直接赋值的如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";