我被问到这个问题:在
String s=new String("abc");
如何以编程方式证明String literal" abc"将被添加到字符串池?
PS:我知道JLS说 - 所有字符串文字(""之间的字符串)被添加到字符串池。
另外,我查看了生成的字节代码,但是在字节代码中,我只能看到类常量池而不是字符串常量池。
答案 0 :(得分:3)
您可以使用
s != s.intern()
产生true
。
说明:在调用"abc"
之前,假设s.intern()
不在字符串池中。然后s.intern()
会将s
添加到字符串池中,并且两边都相等(引用相等==
)。
E.g。这会打印false
:
String s2 = "x".concat("yz"); // "xyz" is not in the string pool, since it's calculated using a method
System.out.println(s2 != s2.intern());
由于双方不相等,"abc"
在调用intern()
之前在字符串池中,这证明了索赔。 (reductio ad impossibilem)
注意:如果您使用String s = "abc";
直接指定字符串文字,则此方法无效。但是,在这种情况下,您仍然可以使用new String(s)
创建一个新字符串,并使用新字符串。