首先我怀疑,当我创建一个字符串
时String s = new String("Stack");
"Stack"
是否保存在字符串常量池中?
但是这篇文章:what happens with new String("") in String Constant pool告诉它不是。
但根据这篇文章的回答:where do actual parameters in java store告诉它存在于常量池中。
请对此作出澄清。
答案 0 :(得分:4)
如果你这样做:
String s = "Stack";
..那么文字字符串“Stack”实际上是常量字符串池的一部分。当你这样做时:
String s = new String("Stack");
...但是,原始文字字符串“Stack”是字符串池的一部分,但是在这里使用“new”会强制构建一个不在常量池中的副本。
答案 1 :(得分:2)
String s=new String("Stack");
对于上面的语句,将在常量池中创建一个字符串文字Stack
,并且在堆中,将有另一个String
对象,它将通过引用{{1}引用}。
答案 2 :(得分:1)
当你做这样的事情时:
String a = "ang";
String b = "ang";
字符串a和b都指向相同的“ang”。引用将是相同的,因为它们都指向字符串池中的“ang”。
但是当你这样做时:
String a = new String("ang");
String b = new String("ang");
他们都指向不同的对象。
答案 3 :(得分:0)
但是这篇文章:在字符串常量池中使用新字符串(“”)会发生什么事情告诉它不是。
不,不。看到第一条评论:'两者。都。都。'或者接受的答案:“'intern()'或字符串文字”。
但根据这篇文章的答案:java商店中的实际参数在哪里告诉它存在于常量池中。
正确。编译器将字符串文字放在那里,intern()将动态字符串放在那里。