StringBuilder旨在減少與創建字符串相關的開銷。
正如你可能會或可能不知道,字符串是不可變的。這意味着什麼像
String a = "foo";
String b = "bar";
String c = a + b;
String d = c + c;
爲每一行創建一個新的字符串。如果我們關心的是最後一個字符串d
,那麼帶有字符串c
的行會浪費空間,因爲當我們不需要它時,它會創建一個新的String
對象。
字符串生成器只是延遲實際構建String
對象,直到您致電.toString()
。此時,它會將內部char[]
轉換爲實際的字符串。
再舉一個例子。
String foo() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100; i++)
sb.append(i);
return sb.toString();
}
在這裏,我們只創建一個字符串。 StringBuilder
將跟蹤您在內部char[] value
中添加到字符串中的字符。需要注意的是value.length
一般會比你已經添加到您的StringBuilder
總字符較大,但value
可能會用完的空間,要追加什麼,如果你正在構建的字符串變得太大。當發生這種情況時,它將調整大小,這意味着將value
替換爲更大的char[]
,並將舊值複製到新數組以及隨附的任何字符。
最後,當您撥打sb.toString()
時,StringBuilder
將調用String
構造函數,該構造函數的參數爲char[]
。
這意味着只有一個String
對象被創建,我們只需要足夠的內存用於我們的char[]
並調整它的大小。
比較如下:
String foo() {
String toReturn = "";
for (int i = 0; i < 100; i++)
toReturn += "" + i;
toReturn;
}
在這裏,我們已經創建了101個string對象(也許更多,我不確定)。我們只需要一個!這意味着在每次調用時,我們都要處理原始字符串toReturn
,並創建另一個字符串。
有了一個大的字符串,尤其是,這是非常昂貴的,因爲在每一個呼叫,您需要首先獲取儘可能多的內存新的字符串的需求,並儘可能多的內存處置作爲老串了。當事情總是很短時,這不是什麼大問題,但是當你處理整個文件時,這很容易成爲問題。
簡而言之:如果你正在最後敲定輸出之前的工作追加/刪除信息:使用StringBuilder
。如果你的字符串非常短,我認爲可以正常連接以方便連接,但這取決於你自己定義「short」是什麼。
你有沒有嘗試過一些代碼..如果是的話請分享,如果不是請... –
'StringBuilder'被設計用來有效地連接字符串。它不是爲字符串格式設計的。 Java有'String.format',它可以讓你執行'printf'樣式格式。你不允許使用這個嗎? – sh0rug0ru