所有,
我在写下面的代码时遇到了问题

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

这让我很困惑。为什么第二个打印为TRUE但第一个打印为FALSE?
在我理解String文字池时,当定义了一个字符串时,JVM将检查该池中是否包含该字符串,如果没有,则将该字符串放入该池中。在我的代码中,变量你好存在于字符串池中,“ “”和“ lo ”也在游泳池中,我的问题是

如果池中存在“ Helo ”和“ lo ”串联的结果,则为
  • 关于str5和str10s的定义有什么区别,为什么它们不是“==”? str5和str10是否引用字符串池中不同的“您好”?(“==”似乎表示引用是同一对象)

  • 我的jdk版本:1.6.0_29
    我的IDE:Intellij Idea 11.2

    有人可以指出吗?非常感谢你

    最佳答案

    它的行为应有。 JLS分为两个部分。

    JLS #3.10.5:

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

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

    在您的情况下,如果稍​​微更改代码以使str8str9保持不变,则将获得true 3次:

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

    07-24 18:34