面試或考試常見:StringBuilder 的 append 與 String 的 concat(或 +)效能差異。
String 物件,複製字元陣列,**O(n²)** 總複雜度,僅適合少量、固定次數拼接。// String.concat 簡化邏輯
public String concat(String str) {
int len = value.length;
char[] newVal = Arrays.copyOf(value, len + str.length());
str.getChars(0, str.length(), newVal, len);
return new String(newVal); // 每次新建物件、複製陣列
}
// StringBuilder.append 簡化邏輯
public StringBuilder append(String str) {
ensureCapacityInternal(count + str.length()); // 指數擴容
str.getChars(0, str.length(), value, count);
count += str.length();
return this; // 同一物件,鏈式呼叫
}
| 方式 | 耗時 | 記憶體分配 |
|---|---|---|
String + | ~12,000 ms | 極大(大量臨時物件觸發 GC) |
String.concat | ~11,500 ms | 極大 |
StringBuilder.append | ~5 ms | 極小(僅擴容陣列) |
StringBuilder(單執行緒)或 StringBuffer(多執行緒)。String a = "A" + "B" + "C"; 編譯器優化為 StringBuilder,可讀性最好。String.join(",", list)、Collectors.joining() 內部同樣用 StringBuilder。一言以蔽之:大量拼接用 StringBuilder.append,少量固定用 + 即可。