| 特性 | String | StringBuffer | StringBuilder |
|---|---|---|---|
| 可變性 | 不可變 | 可變 | 可變 |
| 線程安全 | 是(不可變天然安全) | 是(方法 synchronized) | 否 |
| 效能 | 頻繁拼接極差 | 中等(同步開銷) | 最高(無同步) |
| 適用場景 | 常量、少量拼接 | 多線程環境大量拼接 | 單線程大量拼接 |
每次拼接 s += "x" 實際產生:新 StringBuilder → append → toString() → 新 String。循環 1 萬次約產生 4 萬對象,觸發頻繁 GC,效能指數級下降。
// 編譯期常量折疊 String s1 = "a" + "b" + "c"; // 直接變為 "abc",零開銷 // 變量拼接無法優化 String a = "a", b = "b", c = "c"; String s2 = a + b + c; // 運行期仍建立 StringBuilder
兩者繼承自 AbstractStringBuilder,方法幾乎相同。StringBuffer 所有公共方法加 synchronized,單線程下每次操作需獲取/釋放鎖,效能損耗約 10-15%。
String : ~980 ms StringBuffer: ~2 ms StringBuilder: ~1 ms
StringBuilder(單線程)或 StringBuffer(多線程)。+ 拼接 String。new StringBuilder(1024) 減少擴容複製。StringBuilder,用完即棄,無線程洩漏風險。StringBuffer 或額外同步機制。StringBuffer,除非確定為瓶頸且單線程。