在堆上创建了多少个 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.
答案是 1。"A" 通过存在于堆中的 String Pool
添加到堆中的任何 3 行 运行 之前。前两行引用字符串池中的现有值。第三行强制在堆上创建一个新对象。
这是一篇很棒的文章:
http://www.journaldev.com/797/what-is-java-string-pool
注意:我对下面的评论进行了更正。 "A" 在第 1 行 运行 之前就已经存在于线程池中,因此实际上在第 1 行中没有添加任何内容。因此,正如您在采访中所说,对堆的净更改为 1,因为只有第 3 行实际上影响了堆。
我在面试中被问到一个问题——在堆上创建了多少个对象:
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 inpermgen area
of heap, but in Java 1.7 updates its moved to main heap area. Earlier since it was inPermGen 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 manyString literals
can causejava.lang.OutOfMemory: permgen space
. Now becauseString pool
is moved to a much larger memory space, it's much more safe.
答案是 1。"A" 通过存在于堆中的 String Pool
添加到堆中的任何 3 行 运行 之前。前两行引用字符串池中的现有值。第三行强制在堆上创建一个新对象。
这是一篇很棒的文章: http://www.journaldev.com/797/what-is-java-string-pool
注意:我对下面的评论进行了更正。 "A" 在第 1 行 运行 之前就已经存在于线程池中,因此实际上在第 1 行中没有添加任何内容。因此,正如您在采访中所说,对堆的净更改为 1,因为只有第 3 行实际上影响了堆。