3 回答

TA貢獻(xiàn)1824條經(jīng)驗 獲得超6個贊
String
不允許附加。您在a上調(diào)用的每個方法都會String
創(chuàng)建一個新對象并將其返回。這是因為String
它是不可變的 - 它不能改變它的內(nèi)部狀態(tài)。
另一方面StringBuilder
是可變的。調(diào)用append(..)
它時會改變內(nèi)部char數(shù)組,而不是創(chuàng)建新的字符串對象。
因此,擁有以下內(nèi)容更有效:
StringBuilder sb = new StringBuilder();for (int i = 0; i < 500; i ++) { sb.append(i);}
而不是str += i
,它將創(chuàng)建500個新的字符串對象。
請注意,在示例中我使用循環(huán)。正如helios在評論中指出的那樣,編譯器會自動將表達(dá)式轉(zhuǎn)換String d = a + b + c
為類似的表達(dá)式
String d = new StringBuilder(a).append(b).append(c).toString();
還需要注意的是有StringBuffer
除StringBuilder
。不同之處在于前者具有同步方法。如果將其用作局部變量,請使用StringBuilder
。如果它可能被多個線程訪問,請使用StringBuffer
(這是罕見的)

TA貢獻(xiàn)1824條經(jīng)驗 獲得超8個贊
這是一個具體的例子,為什么 -
int total = 50000;
String s = "";
for (int i = 0; i < total; i++) { s += String.valueOf(i); }
// 4828ms
StringBuilder sb = new StringBuilder();
for (int i = 0; i < total; i++) { sb.append(String.valueOf(i)); }
// 4ms
正如您所看到的,性能差異很大。
添加回答
舉報