2013-03-19 96 views
2

我知道StringBuilder應該用於連接多個字符串,而不是使用+。我的問題是關鍵點是什麼?Java - 多少個字符串concat應該提示使用StringBuilder?

我被告知,如果連接4個或更多的字符串,你應該使用StringBuilder.append(),對於其他任何事情,請使用+。 是這樣嗎?或者是stringbuilder的效率超過4的那個點?

+1

http://stackoverflow.com/questions/1532461/stringbuilder-vs-string-concatenation-in-tostring-in-java – 2013-03-19 14:58:49

+0

這可能是對你有意思:http://stackoverflow.com/questions/7586266/ is-chain-of-stringbuilder-append-more-efficient-than-string-concatenation – 2013-03-19 15:00:21

回答

0

沒有定義答案,因爲它取決於JVM的實現。當我需要連接3個以上的字符串時,我使用StringBuilder

我注意到一個很好的例子。當您需要連接static final String時,您不必使用StringBuilder。 compliler將連接它與我的表現下降:

final class Example { 

    public static final String STRING_ONE = "string"; 
    public static final String STRING_TWO = "string"; 
    public static final String STRING_THREE = "string"; 
    public static final String STRING_FOUR = "string"; 

    public String getBigString() { 
     return STRING_ONE + STRING_TWO + STRING_THREE + STRING_FOUR;  
    } 

} 

另外我對這個問題非常感興趣。我嘗試着實施一個很好的測試,並詢問有關here

0

我會說編譯器會用StringBuilder本身代替加號。

在這種情況下,您有幾種情況需要避免。例如在迴路中使用+。對於每次迭代,都會創建一個新的StringBuilder

可能想讀這question

1

開始在JSE 5,+號編譯過程中轉換成一個StringBuilder。

有一個警告此雖然,這:

String blam = a + b + c + d + e; 

結果在一個stringbuilder的和5次追加(如預期)

這;但是:

String blam = a; 
blam += b + c; 
blam := d + e; 

導致3個串行構建器(每行一個)。

點:+符號很好,只是將它堆疊在一行代碼中。

+1

實際上,在循環中,它爲每個concat創建一個字符串生成器,這可能會很多。在捕獲循環的情況下,您應該在其頂部定義生成器並在每次迭代中追加。 – Cruncher 2013-03-19 15:02:28

+0

正確。不要在循環內部進行字符串連接。 – DwB 2013-03-19 15:04:01

2

從Java 1.5開始,當在源中使用+時,編譯器自動使用StringBuilder

Javadoc for String

Java語言提供對字符串連接運算符(+)的特殊支持,以及對其他對象的字符串轉換。字符串連接通過StringBuilder(或StringBuffer)類及其append方法實現。

0

編譯器在優化這個東西方面很不錯,所以通常你不會獲得太多。但是,如果你在循環中進行連接,你可能會從使用StringBuilder中獲得一些好處。

2

零。

很多年以前,在很遠很遠(1.4)一個Java版本,一些人通過StringBuffer(線程安全等效StringBuilder,這還沒有發明出來)建議更換級聯。

通過引入StringBuilder,和串接在的更快StringBuilder,「優化的」使用不需要的同步發生StringBuffer代碼方面的重新定義,而具有+非最佳代碼被自動地享有的StringBuilder的好處。

我將使用StringBuilder當串聯與控制結構或循環混合,或當我需要更新字符串中的某些字符。否則,我認爲編譯器足夠聰明,可以很好地處理傳統的並置。