Java 如何以编程方式证明字符串s=新字符串(“abc”)添加了文字字符串;abc";到字符串池
我在某处被问到这个问题:在Java 如何以编程方式证明字符串s=新字符串(“abc”)添加了文字字符串;abc";到字符串池,java,string,Java,String,我在某处被问到这个问题:在 String s=new String("abc"); 如何以编程方式证明字符串文字“abc”将添加到字符串池中 PS:我知道JLS说-所有字符串文本(括在“”之间的字符串)都添加到字符串池中 此外,我还查看了生成的字节码,但在字节码中,我只能看到类常量池而不是字符串常量池。您可以使用 s != s.intern() 这将产生true 解释:假设调用s.intern()之前,“abc”不在字符串池中。然后s.intern() 例如,这将打印false: Stri
String s=new String("abc");
如何以编程方式证明字符串文字“abc”将添加到字符串池中
PS:我知道JLS说-所有字符串文本(括在“”之间的字符串)都添加到字符串池中
此外,我还查看了生成的字节码,但在字节码中,我只能看到类常量池而不是字符串常量池。您可以使用
s != s.intern()
这将产生true
解释:假设调用s.intern()
之前,“abc”不在字符串池中。然后s.intern()
例如,这将打印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()
之前就在字符串池中,这证明了这一说法。()
注意:如果您使用string s=“abc”直接指定字符串文字,则这不起作用代码>。但是,在这种情况下,您仍然可以使用新字符串创建新字符串
,并使用新字符串。您在这里说什么<代码>System.out.println(“abc”==新字符串(“abc”)
显示,即使字符串在字符串池中,引用也不相同。@ElliottFrisch-s1.value==s2.value:true
//这证明了s1和s2的内部字符数组是相同的。您所能证明的是,如果您尝试插入文本字符串,您将获得相同的值。。。有时候。您可以尝试1000次而不证明任何内容,因为第1001次尝试可能会失败。@HotLicks-s1.value和s2.value的标识哈希代码是相同的,因此,它们在内部使用相同的“abc”。所谓“编程证明”,您的意思是“演示”?对于String s=new String(“abc”)
,s==s.intern()
返回false。还有,'charc={'p','q','r'};`<代码>字符串s=新字符串(c)代码>。现在,如果执行s==s.intern()
,则会得到false
<在调用intern之前,code>pqr
不在字符串池中。@TheLostMind:你想用第一句话告诉我什么???我的回答中已经有了一个等价的陈述(仅用!=
代替=
和true
而不是false
)。“现在如果你做了s==s.intern()
,你会得到false
”这句话是完全错误的(至少上次我用Java8试过了)。