3 回答

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

TA貢獻1824條經驗 獲得超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
正如您所看到的,性能差異很大。
添加回答
舉報