[英]How can I efficiently use StringBuilder?
在過去,我總是使用printf格式化打印到控制台,但我目前的任務(創建發票報告)要求我們使用StringBuilder,但我不知道怎么做,而不是簡單地使用每個“”差距需要。 例如......我應該打印出來
Invoice Customer Salesperson Subtotal Fees Taxes Discount Total
INV001 Company Eccleston, Chris $ 2357.60 $ 40.00 $ 190.19 $ -282.91 $ 2304.88
但是我不知道如何使用StringBuilder來排列所有內容。 有什么建議?
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
添加到字符串的char[] value
。 請注意, value.length
通常會大於您添加到StringBuilder
字符總數,但如果您構建的字符串太大,則value
可能會超出您要附加的內容。 當發生這種情況時,它會調整大小,這意味着用更大的char[]
替換value
,並將舊值復制到新數組,以及附加的任何字符。
最后,當你調用sb.toString()
, StringBuilder
將調用一個帶有char[]
參數的String
構造函數。
這意味着只創建了一個String
對象,我們只需要為char[]
提供足夠的內存並調整其大小。
與以下內容比較:
String foo() {
String toReturn = "";
for (int i = 0; i < 100; i++)
toReturn += "" + i;
toReturn;
}
在這里,我們創建了101個字符串對象(可能更多,我不確定)。 我們只需要一個! 這意味着在每次調用時,我們都會處理原始字符串toReturn
表示,並創建另一個字符串。
特別是對於大字符串,這非常昂貴,因為在每次調用時,您需要首先獲得與新字符串所需的內存一樣多的內存,並且處理與舊字符串一樣多的內存。 當事情保持簡短時,這不是什么大問題,但是當你處理整個文件時,這很容易成為一個問題。
簡而言之:如果您在最終確定輸出之前正在處理附加/刪除信息:使用StringBuilder
。 如果你的字符串非常短,我認為為方便起見只是正常連接是可以的,但這取決於你定義什么是“短”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.