在 Java 字串處理中,String、StringBuffer、StringBuilder 三者關係密切卻差異巨大。選擇錯誤不僅影響效能,更可能引發併發問題。本文從底層原理、API 詳解、效能實測三個維度,助你建立清晰的選型判斷力。
String 物件不可變。每次拼接、替換等操作都會產生新物件,舊物件等待 GC 回收。大量操作時會產生海量臨時物件,導致記憶體抖動與 GC 頻繁觸發,嚴重拖慢效能。
char[] 陣列儲存,預設容量 16 字元,不足自動擴容(JDK 1.5 後為 1.5 倍 + 1)。append、insert、delete 等)皆以 synchronized 修飾,保證多線程安全。StringBuffer 几乎完全一致,繼承自 AbstractStringBuilder。| 方法 | 說明 | 範例 |
|---|---|---|
| append(x) | 尾部追加內容 | sb.append("abc").append(123) |
| insert(offset, x) | 指定位置插入 | sb.insert(3, "xyz") |
| delete(start, end) | 刪除區間字元 [start, end) | sb.delete(1, 4) |
| deleteCharAt(index) | 刪除單一字元 | sb.deleteCharAt(3) |
| setCharAt(index, ch) | 替換指定位置字元 | sb.setCharAt(3, 'z') |
| reverse() | 反轉字串 | sb.reverse() |
| toString() | 轉為 String 物件 | String s = sb.toString() |
String : 5,287 ms StringBuffer: 3 ms StringBuilder: 2 ms
差距隨次數增長呈指數級擴大。30,000 次時 String 超過 35 秒,而 StringBuilder 僅需 8 毫秒。
String s = "a" + "b" + c; 自動優化為 StringBuilder 操作,但循環內拼接不會優化,請手動建立 Builder。String.join()、StringBuilder.append() 多參數重載,進一步簡化代碼。CharSequence 介面,可作為方法參數類型提高靈活性。掌握三者差異,是寫出高效、穩健 Java 代碼的基礎功夫。下次寫字串拼接前,請先問自己:「這裡有多線程嗎?操作頻率如何?」