2013-07-31 167 views
1

字符串池是否包含兩個具有相同值的字符串?字符串池是否包含兩個具有相同值的字符串?

String str = "abc"; 
String str1 = new String("abc"); 

    Will the second statement with `new()` operator creates two objects of `string` "abc", one on `heap` and another on `string` pool? 

    Now if i call intern() on str1 ie str1.intern(); as a third statement, will str1 refer to the "abc" from String pool? 

    If yes then what will happen to the object that was created on heap earlier by the new(). Will that object be eligible for garbage collection.? 
    If no then what will be the result of str1.intern();? 
+0

閱讀本:HTTP://stackoverflow.com/questions/17489250/how-can-a-string-be-initialized-使用/ 17489410#17489410 –

回答

6

沒有第一個也會創建一個對象,第二個也只會創建一個字符串對象。不同之處在於,第一個將在字符串池中創建,第二個將僅在堆中創建。 如果您打電話給str1.intern();然後它將被添加到字符串池。

String str1 = "abc"; 
String str2 = new String("abc"); 
Stirng str3 = "abc" 

這裏將創建兩個對象。第一行將創建一個帶有引用str1的強對象,第三行將指向第一行創建的同一對象,引用str3,但在第二行中,將創建一個新對象,因爲我們在此處使用new關鍵字。希望它能幫助你。

另請檢查this的答案。好的解釋就在那裏。

+0

所以,你的意思是說如果我按照相反的順序執行語句,仍然會有兩個對象? –

+2

@JunedAhsan無論你在那裏做什麼,只會有兩個對象。我編輯了一點我的答案。 Plz再次閱讀。 –

+0

不,這是錯的。如果你用new創建一個對象,它仍然是字符串池的一部分。如果後面跟着一個簡單的string =「sameStirng」語句,則會使用池中的對象,而不是創建新的對象。 –

0

它基本上是:

// "abc" is interned by the JVM in the pool 
String str="abc"; 
// JVM uses the pooled "abc" to create a new instance 
String str1=new String("abc"); 

只有一個新String對象被創建由str1引用。 String文字​​由JVM實施。由於文字​​已經存在於字符串池中,所以在第二個語句中,JVM應該使用它。

+1

'// JVM使用池中的「abc」創建一個新的實例' - JVM首先檢查池中的文字,如果存在,那麼使用該JVM在堆中創建字符串? – exexzian

+0

@sansix這種說法與我的不同之處在哪裏? – NINCOMPOOP

+0

我沒有downvoted你 - 我只是有疑問 - 'JVM應該使用'文字池值或'使用'值 – exexzian

0

在類加載時會創建「abc」對象並放在字符串池中。第二行將使用String(String original)構造函數,其中original是指向池中「abc」的指針。這是第二行中的字節碼:

NEW java/lang/String 
DUP 
LDC "abc" 
INVOKESPECIAL java/lang/String.<init>(Ljava/lang/String;)V 
ASTORE 2 
1

new String("abc")是一個類的實例創建表達式,和必須創建一個新對象。它是否與字符串「abc」在內部共享相同的char數組取決於字符串實現。 「abc」引用都將使用相同的intern字符串。

+0

文檔說「新創建的字符串是參數字符串的副本」。這聽起來像沒有'char []'共享應該被允許發生(儘管不是100%明確的)。 –

+0

@MarkoTopolnik在文檔中沒有提及或需要使用char [],所以「副本」評論不太可能適用於它,而不是String參數。實際上,只有在String參數比它的數組短的情況下,JDK 1.7實現纔會複製數組。這可能是子字符串操作的結果。 –

+0

是的,這就是爲什麼我說它不是100%明確的,但請注意:它不會說「新創建的字符串」,而是「新創建的字符串」。實際的字符串存儲在'char []'中。 –

1
String t1 = "ABC"; 
    String t2 = new String("ABC"); 
    String t3 = "ABC"; 

    System.out.println(t1 == t2); 
    System.out.println(t2 == t3); 
    System.out.println(t1 == t3); 

產生如下的輸出(爪哇SE 7):

false 
    false 
    true 
相關問題