2015-10-14 42 views
1

在過去,我一直使用printf格式化打印到控制檯,但我目前擁有的任務(創建發票報告)希望我們使用StringBuilder,但我不知道如何在不使用「」爲每個需要的差距。例如...我應該打印出來如何有效地使用StringBuilder?

Invoice Customer           Salesperson      Subtotal  Fees  Taxes Discount  Total 
INV001 Company           Eccleston, Chris    $ 2357.60 $  40.00 $ 190.19 $ -282.91 $ 2304.88 

但我不知道如何讓所有東西排隊使用StringBuilder。有什麼建議?

+2

你有沒有嘗試過一些代碼..如果是的話請分享,如果不是請... –

+3

'StringBuilder'被設計用來有效地連接字符串。它不是爲字符串格式設計的。 Java有'String.format',它可以讓你執行'printf'樣式格式。你不允許使用這個嗎? – sh0rug0ru

回答

2

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」是什麼。