2012-04-05 57 views
1

如果我做的:這是否會使StringBuilder冗餘?

StringBuilder sb = new StringBuilder(); 
sb.append("somestring" + "hello" + "more strings" + "last one"); 

的是,同樣爲:

string s = "somestring"; 
s + "hello" + "more strings" + "last one"; 

難道讓使用字符串生成器沒有意義?因此需要使用:

StringBuilder sb = new StringBuilder(); 
sb.append("somestring"); 
sb.append("hello"); 
sb.append("more strings"); 
sb.append("last one"); 

回答

4

您的長問題的簡短答案是「是」。

0

StringBuilder是可變的,但String不是。 StringBuilder使這些字符串操作更高效。 對於你的例子這樣一個小的工作,你可能不會注意到不同之處。

+0

這不是更有效率。由於常數摺疊,'+'運算符對於常量更有效。編譯器無法以這種方式優化方法調用,因此'StringBuilder'將始終在運行時附加。在編譯期間,附加了'+'的常量將被優化爲單個字符串常量。 – 2012-04-10 07:56:10

4

如果這是全部您在該代碼片段中使用StringBuilder,這確實沒有意義。如果您在首次致電append後繼續追加,則完全沒有毫無意義。不過,最後一個例子比前兩個例子更有意義。

我假設你的文章中的常量只是爲了清晰。如果他們確實是常量,編譯器會做constant folding,使得第一個例子相當於

StringBuilder sb = new StringBuilder(); 
sb.append("somestringhello"); 
+0

常量摺疊不適用於方法調用。它可以和'+'運算符一起工作。 – 2012-04-10 07:24:35

+0

@AlanEscreet我寫了這個問題的第一個編輯的答案,其中OP只有兩個字符串,而不是四個。 – dasblinkenlight 2012-04-10 10:32:52

+0

仍爲其+1了。你的回答是絕對正確的。 :-) – 2012-04-10 10:38:10

1

綜觀代碼編譯後的輸出,它使用StringBuilder的VS,簡單地連接字符串代碼,我發現,最新的編譯器通常會無論何時適用,都可以使用StringBuilder。話雖如此,請注意,在你的第一個例子中,你需要說's = s +「hello」;爲了趕上結果。

0

在第一種情況下,固定文字將被編譯器檢測到,並將作爲單個值內聯。像

sb.append("somestring" + "hello" + "more strings" + "last one"); 

將被視爲

sb.append("somestringhellomore stringslast one"); 

因此,將追加僅一次的StringBuilder。


在第二種情況下,它追加多次。

2

StringBuilderStringBuffer應該用來代替字符串「+」操作,當你多次追加元素時。如:

String s = new String(); 
for(int i=0; i < x; i++){ 
    s += i; 
} 

因爲這將要被轉換成(沿的線的東西):

String s = new String(); 
for(int i=0; i < x; i++){ 
    StringBuffer sb = new StringBuffer(); 
    sb.append(s); 
    sb.append(i) 
    s = sb.toString(); 
} 

在每次迭代中(字節碼等效內)要創建一個StringBuffer並將其轉換變成String

有許多來源,但是; thisthis都可以。我在2010年左右在這個問題上做了一個小的研究,而我在這個問題上的知識可以追溯到這一點。如果自那時起還有其他改進,我不知道它。

0

根據String javadocs+運營商無論如何轉換爲StringBuilder

的兩個主要區別是:

  1. 當您連接一組文字的,你在你的例子都有。常量摺疊將在編譯時將這些單獨的字符串轉換爲單個字符串,從而避免在運行時執行此操作。

    "somestring" + "hello" + "more strings" + "last one"成爲"somestringhellomore stringslast one"

  2. 當你在外環或其他分支結構串聯。使用+將創建多個StringBuilder實例,這將在運行時使用更多的內存和處理能力。 (見http://nicklothian.com/blog/2005/06/09/on-java-string-concatenation/