public static void main(String[] args) {
String s1 = new String("aa");
s1.intern();
String s2 = "aa";
System.out.println(s1 == s2);
//wrong in JDK1.6 but true in JDK1.8
String str1 = new String("str") + new String("01");
str1.intern();
String str2 = "str01";
System.out.println(str1 == str2);
}
我用JDK1.8运行了上面的代码,我认为结果会得到两个“false”,因为在我看来,s1和str1明显位于堆中,s2和str2则存储在字符串池中,但我得到了一个“false”和一个“true”。
问题是:是什么导致了“true”?
上面是基本问题。现在要确定这个问题与所谓的重复问题远离,我想谈谈我的新发现:使用JDK1.6时,代码的第二部分得到了一个“false”的结果,而使用JDK1.8时得到了一个“true”的结果。一些博客表示,自JDK1.7发布以来,intern()的行为已经改变。
如果池中不包含等于此String对象的字符串,则不会将此String对象添加到池中,而是将对此String对象的引用添加到池中。这意味着池中的引用将被分配给位于其他位置(如堆)的字符串对象,并且下一次初始化文字字符串等于早期字符串将被分配给字符串对象,这恰好描述了有关“true”结果的代码部分2。
这个理论确实能够解释上面代码的结果。但很明显,这个理论不符合intern()文档中包含的内容,该文档在JDK6/8 API中几乎相同。
现在问题来了:用JDK1.6和JDK 1.8中的相同代码得到不同结果是否有更好的解释?我提到的理论是否确切地发生了?
intern()
是Python中的一个字符串方法,用于将字符串添加到内存缓存中以便重复使用。 - Maroun