堆内存和字符串池之间的区别

11

Java中堆内存和字符串池有什么区别?

在这个链接中提到:

String s1 = "Hello";

String s2 = new String("Hello");

s1指向字符串池的位置,而s2指向堆内存的位置。

2个回答

34

StringPool是JVM用来避免产生重复的String对象的区域。

那里的对象可以被“回收利用”,因此您可以(重新)使用它们,从而避免了太多内存的“浪费”……

考虑以下示例:

String s1 = "cat";

String s2 = "cat";

String s3 = new String("cat");

JVM聪明地发现对象s2将被分配为已经在内存中(并且被分配给对象"s1")的值“cat”,因此它不会创建新对象和浪费该新内存位置,而是将引用分配给为s1分配的同一内存。

输入图像描述


4
图片附加项 - karthzDIGI
在实例化字符串时,我应该使用哪种方法 "" 还是 new?使用其中任何一种方法时,有什么需要注意的问题吗? - Quazi Irfan
1
很好的解释。 - Dulaj Kulathunga
1
很好的解释! - MrNolan

9
当你使用 String s = "Hello"; Sting s2= "Hello" 时,ss2 都得到了相同的副本。但是,当你使用 String s = new String("Hello"); String s2 = new String("Hello") 时,在堆中会有不同的副本分别对应于 ss2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接