字符串池概念的简单解释

时间:2014-01-27 08:31:53

标签: java string

现在我知道很多次都会问这个问题,而且已经多次回答了问题,但是仍然是Java的新手会发现解释难以理解。 所以我从这些问题中理解的内容如下:

String a = "hi";

上述语句首先检查字符串是否存在于字符串池中。如果没有,它会将其添加到池中,并在池中创建它的引用。基本上,对象是在永久生成区域中生成的,字符串池用于引用它。

然而,

String a = new String("hello");

在这种情况下,它会创建两个对象。一个在永久生成区域,一个在正常堆内存中。 a包含对堆内存对象的引用。

现在我的问题是这个概念是否正确。字符串池是引用还是实际字符串池,我所理解的永久生成区域的概念是否正确?如果错了,请用外行的语言解释。 请不要复制,因为我已经知道这已经被回答了很多次。没有人是外行的语言,也很容易理解。实际制作了两个物体吗?如果是,那么如何,如果不是,为什么呢?这真的很有帮助。

3 个答案:

答案 0 :(得分:1)

是的,你理解得很好。当你这样做时:

String a = new String("hello");

将有2个已创建的字符串,一个在上,一个在对象,而不在池中,其中包含存储在对象中的内容的副本池。

你会有类似的东西:

    Pool         
  +-------+               
  |"hello" <-------- a 
  |       |     
  +-------+    

答案 1 :(得分:1)

你所说的效果基本上是正确的。您的配方问题涉及何时发生事件。当你写

String a="hi";

或者实际上,您的Java文件在其中的任何位置都有字符串文字"hi",然后此字符串文字只分配一次:当加载类时,代码开始运行时。然后a的初始化只使用现有的String对象。但是当你有

中的显式构造函数调用时
String a=new String("hi");

然后创建一个新的String。 new表示新的字符串对象。

答案 2 :(得分:0)

String a= new String("hello")
创建了字符串池中的一个对象,并且堆区域中的new运算符创建了另一个对象。a持有String池对象的引用,而字符串池对象持有堆对象的引用。和堆对象包含hello