2013-07-18 47 views
4

我的問題是如果我使用StringBuffer(或StringBuilder),並且如果我多次調用實例的toString方法。 StringBuffer會每次返回String的新實例,還是從String池返回String? (假設我在調用之間沒有對StringBuffer進行任何更改)每次調用StringBuffer#toString和StrinBuilder#toString都會返回字符串池中的新實例或實例?

+0

的可能重複[是否StringBuilder.toString保留了內置的字符串?](http://stackoverflow.com/questions/15724895/does-stringbuilder-tostring-retain-the-built -string) – NINCOMPOOP

回答

4

只有字符串文字放在String常量池中。例如String s = "abc";將在字符串池中,而String s = new String("abc")將不會。 toString()方法創建了一個新的字符串,因此返回的字符串不會來自文字池。

每遇到toString()方法,都會創建一個新的String。

只有在您執行以下操作時,字符串常量池對象纔會再次被引用。

String s = "abc"; 
String s1 = "abc"; 

這意味着兩個參考變量ss1將指相同abc字面在常量池中。

你可以在這裏找到一個關於字符串常量池的有用的文章。 http://www.thejavageek.com/2013/06/19/the-string-constant-pool/

1

是調用的StringBufferStringBuildertoString方法將創建一個新的字符串對象,每次因爲這些方法使用new關鍵詞返回一個字符串。

這裏是從StringBuffer類對的toString的代碼:

public synchronized String toString() { 
     return new String(value, 0, count); 
    } 

這裏是從StringBuilder類toString方法:

public String toString() { 
     // Create a copy, don't share the array 
     return new String(value, 0, count); 
    } 
+0

toString方法總是返回一個新的String實例,因爲這就是它們在API文檔中的記錄方式。他們如何實際執行是非常不相關的。 – jarnbjo

+0

@jarnbjo你可以相信文檔或代碼。代碼將永遠給你比文檔更多的洞察力。在這種情況下,我發現它們都是正確的。但我喜歡深入挖掘api代碼,知道內部使用。 –

+0

如果您想知道標準API中的方法,您必須檢查API文檔。如果您可以在實際代碼中找到其他知識,那只是針對您正在查看的VM版本有效的實現特定細節。您絕對不能保證其他VM(來自其他供應商或同一供應商的其他版本)顯示相同的行爲。 – jarnbjo

4

作爲每的StringBuffer

toString()文檔轉換爲表示此字符串緩衝區中數據的字符串。一個新的String對象被分配並初始化以包含當前由該字符串緩衝區表示的字符序列。這個字符串然後返回。字符串緩衝區的後續更改不會影響字符串的內容。

因此,一個新的String對象被分配和初始化

String objects通過新操作員分配的內容存儲在堆中,並且相同內容沒有共享存儲,其中String文字存儲在公共池中。

String s1 = "Hello";    // String literal 
String s2 = "Hello";    // String literal 
String s3 = s1;     // same reference 
String s4 = new String("Hello"); // String object 
String s5 = new String("Hello"); // String object 

其中s1 == s2 == s3 but s4 != s5

相關問題