2013-03-18 48 views
3

在字節碼使用concat我複習用javac命令行編譯的代碼,我看到了,每當我用字符串連接與+操作,編譯代碼的StringBuilder的append()方法代替。 現在我認爲使用StringBuilder和字符串連接具有相同的性能,因爲他們有相似的字節碼,它是正確的嗎?的java:轉換爲StringBuilder的

回答

11

是的,這是真的!但是當你在循環中連接時,行爲會有所不同。例如

String str = "Some string"; 
for (int i = 0; i < 10; i++) { 
    str += i; 
} 

StringBuilder將在每一個循環迭代(通過str的初始值),並在每一個端部被構造迭代會有級聯與初始字符串(實際上StringBuilderstr初始值)。
因此,只有在循環中使用字符串連接時,您才需要自己創建StringBuilder。

0

的主要差別(和編譯器使用StringBuilder的原因字符串連接)是String是不可變的,而StringBuilder不是。

例如,僅使用字符串計算s1 + s2 + s3將需要s1的字符被複制兩次。這可以(並且)通過使用StringBuilder來避免。

這種優化明確地由JLS允許:

一個實現可以選擇在一個步驟中執行轉換和級聯,以避免創建然後丟棄一箇中間字符串對象。爲了提高重複字符串連接的性能,Java編譯器可以使用StringBuffer類或類似技術來減少通過評估表達式創建的中間String對象的數量。