在堆上创建了多少个 String 对象

How many String objects are created on the Heap

我在面试中被问到一个问题——在堆上创建了多少个对象:

String s1= "A";
String s2= "A";
String s3= new String("A");

我回答了 1 - 因为仅使用 new 运算符,就创建了一个字符串对象。当编译器遇到 s1 时,它会简单地在字符串文字池上创建 "A"。并且 s1 和 s2 指向文字池中的同一个文字。但是面试官把我搞糊涂了,说这个pool在哪?

现在,在某个博客上,我看到:

"In earlier versions of Java, I think up-to Java 1.6 String literal pool is located in permgen area of heap, but in Java 1.7 updates its moved to main heap area."

这样一来,3个字符串对象都创建在了Heap上。不是吗?

但是s1和s2在字符串字面量池中指向同一个字面量(s1==s2为真),所以遇到s2时不应该单独创建一个对象。所以以这种方式,应该只创建2个对象。

有人可以澄清在 Heap 上创建了多少 String 对象吗?我错过了什么吗?

你是对的。 String s3= new String("A");创建了一个String对象,放入内存堆。一个字符串文字 "A" 将被放入 String pool.

分配将在堆中,但它仍将单独存储字符串文字和单独使用 new 创建的对象。

In earlier version of Java, I think up-to Java 1.6 String pool is located in permgen area of heap, but in Java 1.7 updates its moved to main heap area. Earlier since it was in PermGen space, it was always a risk to create too many String object, because its a very limited space, default size 64 MB and used to store class metadata e.g. .class files. Creating too many String literals can cause java.lang.OutOfMemory: permgen space. Now because String pool is moved to a much larger memory space, it's much more safe.

来源:String-literal and String-object

答案是 1。"A" 通过存在于堆中的 String Pool 添加到堆中的任何 3 行 运行 之前。前两行引用字符串池中的现有值。第三行强制在堆上创建一个新对象。

这是一篇很棒的文章: http://www.journaldev.com/797/what-is-java-string-pool

注意:我对下面的评论进行了更正。 "A" 在第 1 行 运行 之前就已经存在于线程池中,因此实际上在第 1 行中没有添加任何内容。因此,正如您在采访中所说,对堆的净更改为 1,因为只有第 3 行实际上影响了堆。