2011-10-25 112 views
11

這兩行有什麼區別?StringBuilder追加vs +

stringBuilder.append("Text " + counter + " more text"); 
stringBuilder.append("Text ").append(counter).append(" more text"); 

假設計數器的遞增INT,並在第一行創建一個字符串"Text 0 more text""Text 1 more text",每次它的名字,而第二行創建只有這兩個字符串一次時間等:"Text "" more text"?它是否正確?

回答

15

簡而言之,是的,除了每次對"Text "" more text"重複使用相同的字符串文字。

第二種方法更高效,因爲它將三個組件中的每一個直接寫入StringBuilder

相比之下,第一種變體創建另一個 - 無名 - StringBuilder,三個組成部分寫進去,要求其toString()方法並將結果寫入到指定stringBuilder

總之,第一個變體創建一個額外的StringBuilder對象和一個額外的String對象,並且複製字符串數據比第二個變體多兩次。

3

是的這是(大部分)是正確的。

事實上,第二個並沒有創建新的字符串,因爲它每次都重複使用相同的字符串。它將使用「文本」和「更多文本」字符串的實際版本。

第一個將使用由編譯器生成的StringBuilder爲「Text 1 more text」和「Text 2 more text」創建一個字符串。

1

是的,你的解釋是(幾乎)正確的。

第一行總是創建String對象像"Text 0 more text",而第二不創建這樣一個String對象。

第二行不創建 * *任何在所有"Text "" more text"String對象是String文字是 GET重新創建每次執行該行的時間。他們只創建一次。

然而,對stringBuilder的影響在兩種情況下都完全相同。

1

這幾乎是正確的。

我會說更多。由於java字符串緩存所有硬編碼字符串,因此字符串「Text」和「more text」的實例不會在每次迭代中創建。

1

這取決於Java是否實施了字符串,但它仍然效率低下。如果你使用.append(「String」+ something +「String」),你可以強制Java創建一堆新的字符串,這樣它最終可以添加到最後一個字符串中緩衝。這是一個經常錯過的內存管理器,通過消除這種類型的代碼,我已經看到web應用程序的內存使用量顯着提高。