簡體   English   中英

我怎樣才能有效地使用StringBuilder?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM