现在我知道很多次都会问这个问题,而且已经多次回答了问题,但是仍然是Java的新手会发现解释难以理解。 所以我从这些问题中理解的内容如下:
String a = "hi";
上述语句首先检查字符串是否存在于字符串池中。如果没有,它会将其添加到池中,并在池中创建它的引用。基本上,对象是在永久生成区域中生成的,字符串池用于引用它。
然而,
String a = new String("hello");
在这种情况下,它会创建两个对象。一个在永久生成区域,一个在正常堆内存中。 a
包含对堆内存对象的引用。
现在我的问题是这个概念是否正确。字符串池是引用还是实际字符串池,我所理解的永久生成区域的概念是否正确?如果错了,请用外行的语言解释。 请不要复制,因为我已经知道这已经被回答了很多次。没有人是外行的语言,也很容易理解。实际制作了两个物体吗?如果是,那么如何,如果不是,为什么呢?这真的很有帮助。
答案 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
。