所有,
我在写下面的代码时遇到了问题
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 ”串联的结果,则为
我的jdk版本:1.6.0_29
我的IDE:Intellij Idea 11.2
有人可以指出吗?非常感谢你
最佳答案
它的行为应有。 JLS分为两个部分。
JLS #3.10.5:
使用String.intern方法,对作为常量表达式(第15.28节)的值的字符串进行“插入”,以便共享唯一的实例。
JLS #15.28列出了被视为常量表达式的内容。特别是,字符串文字是常量表达式(“Hel”和“lo”),但是要使变量被认为是常量,则必须为最终变量。
在您的情况下,如果稍微更改代码以使str8
和str9
保持不变,则将获得true
3次:
final String str8 = "Hel";
final String str9 = "lo";