Java字符串池是否存储重复的文字?
正如我所理解的,每当我们创建一个String文字时,都会检查池中是否存在String具有相同值的任何现有内容。如果存在,则返回对其的引用。否则会创建一个新的文字。
由此,我明白池只包含非重复的String文字。
但我对以下代码的输出感到困惑:
String str1 = "Hello World";
String str2 = "Hello";
String str3 = str2+" World";
System.out.println(str3);
System.out.println(((str1 == str3) ? "equal":"unequal"));`
由于str3正在评估 指向"Hello World"的池中已经存在的对象,因此应该str1分配对相同对象的引用str3,因此str1并且str3应该是相等的。
但是代码显示它们是不平等的。如果有人可以解释,将不胜感激。
回答
str2 + " World"不是一个常量表达式,所以它不被实习。如果str2是 final或直接写为"Hello" + " World",则该值将被实习。
§3.10.5。字符串文字:
此外,字符串字面量始终引用类 String 的同一个实例。这是因为字符串文字 - 或者更一般地说,作为常量表达式(第 15.28 节)的值的字符串 - 使用 String.intern 方法被“嵌入”以便共享唯一实例。
另见:§15.28。常量表达式