字符串常量池如何在java中工作

时间:2014-02-18 10:00:38

标签: java string

首先我怀疑,当我创建一个字符串

String s = new String("Stack");

"Stack"是否保存在字符串常量池中?

但是这篇文章:what happens with new String("") in String Constant pool告诉它不是。

但根据这篇文章的回答:where do actual parameters in java store告诉它存在于常量池中。

请对此作出澄清。

4 个答案:

答案 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()将动态字符串放在那里。