有人問我在interview-問題在堆上創建了多少對象在以下創建:多少String對象都在堆
String s1= "A";
String s2= "A";
String s3= new String("A");
我回答1 - 由於與新的運營商只,創建一個字符串對象。當編譯器遇到s1時,它只會在字符串文字池上創建「A」。而s1和s2指向文字池中相同的文字。但面試官說我的這個游泳池在哪裏?
現在,在一定的博客,我讀:
「在早期版本的Java,我想起來了,到Java 1.6字符串文字池位於堆PermGen的區域,但在Java 1.7更新其感動到主要堆區「。
因此,通過這種方式,所有3個字符串對象都在堆上創建。不是嗎?
但s1和s2指向字符串文字池中相同的文字(s1 == s2爲true),因此當遇到s2時不應創建單獨的對象。所以以這種方式,應該只創建2個對象。
難道有人能夠澄清在堆堆上創建了多少個字符串對象?我錯過了什麼嗎?
是 - 文章的第一行:「顧名思義,String Pool是存儲在Java堆內存中的字符串池」。遷移到堆的1.7中的更改發生在2011年。 –
第一行沒有向字符串池添加任何內容。 「A」已經存在,因爲該類已加載。它最初由編譯器放入.class文件的字符串池中,並由類加載器合併。 – EJP
謝謝@EJP 5.更新答案以反映更正。應該已經睡了:) –