关于java字符串文字池和字符串';s串联

关于java字符串文字池和字符串';s串联,java,string,Java,String,全部,, 我在写下面的代码时遇到了一个问题 String hello = "Hello"; String str5 = "Hel" + "lo"; String str8 = "Hel"; String str9 = "lo"; String str10 = str8 + str9; System.out.println("str10==hello?" + (str10 == hello)); System.out.println("str5==hello?" + (str5 == hello

全部,, 我在写下面的代码时遇到了一个问题

String hello = "Hello";
String str5 = "Hel" + "lo";
String str8 = "Hel";
String str9 = "lo";
String str10 = str8 + str9;
System.out.println("str10==hello?" + (str10 == hello)); 
System.out.println("str5==hello?" + (str5 == hello));
System.out.println("str10==str5?" + (str10 == str5));
然后我运行我的代码,控制台打印这个

str10 == hello ? false
str5 == hello ? true
str10 == str5 ? false
这让我很困惑。为什么第二次打印为真而第一次打印为假?? 在我对字符串文字池的理解中,当一个字符串被定义时,JVM将检查该池是否包含该字符串,如果不包含,则将该字符串放入该池。
在我的代码中,变量hello存在于字符串池中,Helo”和“lo”也存在于该池中,我的问题是

  • 如果池中存在“Helo”和“lo”串联的结果
  • str5和str10的定义有什么区别?为什么它们不是“=”?str5和str10是否引用字符串池中不同的“Hello”(“==”似乎表示引用是同一个对象)
  • 我的jdk版本:1.6.029
    我的IDE:Intellij Idea 11.2


    任何人都可以指出这一点吗?非常感谢你

    它的表现应该是这样的。JLS的两个部分对此进行了讨论

    :

    作为常量表达式(§15.28)值的字符串被“插入”,以便使用String.intern方法共享唯一实例

    列出被视为常量表达式的内容。特别是,字符串文字是常量表达式(“Hel”和“lo”),但要将变量视为常量,它必须是最终的

    在您的情况下,如果您稍微更改代码以使
    str8
    str9
    保持不变,您将得到
    true
    三次:

    final String str8 = "Hel";
    final String str9 = "lo";
    

    如果比较两个字符串,请使用
    string.equals
    not
    string1==string2

    试试看:

    System.out.println("str10==hello?" + (str10.equals(hello));
    

    该准则有以下几点需要考虑:

    String hello = "Hello";
    
    这里“Hello”是一个分配给reference Hello的文本,因此该文本有自己的hashcode

    String str5 = "Hel" + "lo";
    
    String str10 = str8 + str9;
    System.out.println("str10==hello?" + (str10 == hello)); 
    System.out.println("str5==hello?" + (str5 == hello));
    System.out.println("str10==str5?" + (str10 == str5));
    
    这里的“Hel”+“lo”是两个字面值的组合,并分配给reference hello,因此新字面值与第一个字面值相同,因此哈希代码相同

    String str8 = "Hel";
    String str9 = "lo";
    
    这里str8+str9是两个引用,它们组合并指向一个新的引用hello,因此新的文本有自己的hashcode

    String str5 = "Hel" + "lo";
    
    String str10 = str8 + str9;
    System.out.println("str10==hello?" + (str10 == hello)); 
    System.out.println("str5==hello?" + (str5 == hello));
    System.out.println("str10==str5?" + (str10 == str5));
    
    当您使用==时,它通过哈希代码和值匹配。因此不匹配

    尝试使用

    字符串_1.等于(字符串_2)

    而不是

    字符串_1==字符串_2

    你只会得到值匹配,所以都是真的

    请同时参考以下答案(来源):

    equals()方法比较字符串实例(堆上)内的“值”,而不管这两(2)个对象引用是否引用同一个字符串实例。如果任何两(2)个String类型的对象引用引用引用同一个字符串实例,那就太好了!如果这两(2)个对象引用引用引用引用了两(2)个不同的字符串实例..没有区别。它是每个要比较的字符串实例中的“值”(即:字符数组的内容)


    另一方面,“==”运算符比较两个对象引用的值,以查看它们是否引用同一个字符串实例。如果两个对象引用的值“引用”同一个字符串实例,则布尔表达式的结果将为“true”。.duh.另一方面,如果两个对象引用的值“引用”“不同的字符串实例(即使两个字符串实例具有相同的“值”,即每个字符串实例的字符数组的内容相同),布尔表达式的结果将是“false”。

    很抱歉,我不理解“use==它通过哈希代码和值匹配”,
    我打印了str5、str8、str5的每个哈希代码,str9,str10是你好。hash->69609650;str8.hash->72431;str9.hash->3459;str10.hash->69609650;str5.hash->69609650;我们可以看到,str5的hashcode,str10的代码完全相同,但是str5==str10返回false;谢谢你花时间写这篇文章。这解决了我对“==”和“equals”的混淆。非常感谢。是的,正如我们在字符串equals源代码中看到的,首先检查(this==anObject){return true;},然后判断它是否是字符串的实例,如果是,比较两个字符串对象的内容。