String str1 = "abc";
String str2 = "def";
String str5 = "abc";

String str3 = str1 + str2;
String str4 = str1 + str2;

System.out.println("str3 == str4 返回 " + (str3 == str4));
System.out.println("str1 = str5 返回 " + (str1 == str5));有没有能解释清楚的?

解决方案 »

  1.   

    3,4指向的是2个不同的String对象(在String类内,最后返回的是一个new String对象)
    而1,2,3指向的是静态常量池内的变量。1,3所指是相同的
      

  2.   

    String的那些事儿。。都可以出书了
    版内兄弟们从最早的对象比较开始到最后从字节码反编译。。全套分析过程,全都有。。
    楼主何不搜索下
      

  3.   


    而1,2,3指向的是静态常量池内的变量。1,3所指是相同的??说错了吧?3,4指向的是2个不同的String对象(在String类内,最后返回的是一个new String对象)为什么说指向不同对象?
      

  4.   

    String str1 = "abc"; //创建了一个字符串。假设内存地址ID是17
    String str2 = "def"; //又创建了一个字符串。假设内存地址ID是25
    String str5 = "abc"; //java在创建字符传的时候如果发现是已经创建过的,会引用原来的内存地址。所以这里的内存地址Id和第一个一样,也是17.String str3 = str1 + str2;  //java中字符创的+都是创建一个新的内存地址,不管加的内容是不是一致。假设这里内存地址ID是26String str4 = str1 + str2; //不管加的内容是不是一致都分配一个新内存地址。假设这里内存地址ID是27
    在Java字符串的比较"=="实际比较的是它们的内存地址是不是一致。所以打印出来的结果自然是“false”,"true".明白了吗?
      

  5.   

    str3 == str4 返回 false
    str1 = str5 返回 true
      

  6.   

    如果 str5 = "hello";
    这样就str5的地址变了吗?
    不是17而是如18吗?