一、StringBuilder 核心定位
- 可變字串:內部 `char[]` / `byte[]` (JDK 9+ Compact Strings) 陣列,支援動態擴容
- 非執行緒安全:無 `synchronized`,單執行緒效能優於
StringBuffer
- 繼承體系:
AbstractStringBuilder → StringBuilder / StringBuffer
- 預設容量:16 字元,或 `參數長度 + 16`
二、核心方法分類速查
| 分類 | 方法 | 說明 |
| 建構子 | StringBuilder() | 容量 16 |
StringBuilder(int capacity) | 指定初始容量 |
StringBuilder(String str) | 內容初始化,容量 str.length()+16 |
StringBuilder(CharSequence cs) | CharSequence 來源 |
| 新增 | append(...) | 尾部追加,支援所有基本型別、物件、CharSequence、陣列切片 |
appendCodePoint(int cp) | 追加 Unicode 碼點 |
insert(int offset, ...) | 指定位置插入,支援同 append 所有型別 |
重點:所有 append/insert 返回 this,支援鏈式調用 |
| 刪除 | delete(int start, int end) | 刪除 [start, end) 區間 |
deleteCharAt(int index) | 刪除單一字元 |
返回 this |
| 修改 | replace(int start, int end, String str) | 區間替換 |
setCharAt(int index, char ch) | 單一字元替換 |
setLength(int newLength) | 截斷或擴展(補 \0) |
| 查詢 | charAt(int index) | 單一字元 |
indexOf(String str) / indexOf(String str, int fromIndex) | 正向搜尋 |
lastIndexOf(String str) / lastIndexOf(String str, int fromIndex) | 反向搜尋 |
substring(int start) / substring(int start, int end) | 返回新 String |
subSequence(int start, int end) | 返回 CharSequence |
| 其他 | reverse() | 反轉序列,返回 this |
capacity() | 當前容量 |
length() | 當前長度 |
trimToSize() | 容量縮減至長度 |
toString() | 生成新 String(複製內容) |
三、實戰範例:核心 API 演示
1. 鏈式構建 SQL
StringBuilder sql = new StringBuilder(128);
sql.append("SELECT ")
.append("id, name, email ")
.append("FROM users ")
.append("WHERE status = ")
.append(1)
.append(" AND created_at > '")
.append(LocalDate.now().minusDays(30))
.append("'");
System.out.println(sql); // 直接列印會呼叫 toString()
2. 高效字串拼接(避免 + 產生大量中間物件)
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
sb.append("Item ").append(i).append('\n');
}
String result = sb.toString(); // 僅一次物件建立
3. 插入與替換
StringBuilder sb = new StringBuilder("HelloWorld");
sb.insert(5, ", "); // "Hello, World"
sb.replace(0, 5, "Hi"); // "Hi, World"
sb.setCharAt(0, 'h'); // "hi, World"
4. 反轉與搜尋
StringBuilder sb = new StringBuilder("racecar");
sb.reverse(); // "racecar" (回文)
System.out.println(sb.indexOf("cec")); // 2
System.out.println(sb.lastIndexOf("a")); // 4
四、效能優化關鍵
| 場景 | 建議 | 原因 |
| 大量拼接 | 預估長度建構子 new StringBuilder(estimatedSize) | 避免多次擴容複製陣列 |
| 循環拼接 | 循環外建立 StringBuilder,循環內 append | 避免每次迴圈 new 物件 |
| 最終輸出 | 僅呼叫一次 toString() | 每次 toString() 都複製陣列 |
| 多執行緒 | 改用 StringBuffer 或 ThreadLocal | StringBuilder 非執行緒安全 |
五、JDK 9+ Compact Strings 變化
- 內部改為 `byte[] value` + `byte coder` (LATIN1/UTF16)
- 純 ASCII 字串節省 50% 記憶體
- API 行為完全相容,無需修改代碼
六、常見誤區
StringBuilder sb = "abc"; ❌ 編譯錯誤,需 new StringBuilder("abc")
sb.append(obj) 會呼叫 obj.toString(),若 obj 為 null → 追加 "null" 字串
substring 返回 新 String,不影響原 StringBuilder
- 不可直接用於 `switch`、`Map` key(需先
toString())