StringBuilder vs StringBuffer:線程安全與性能的權衡
核心差異一覽
| 維度 | StringBuilder | StringBuffer |
| 線程安全 | ❌ 非線程安全 | ✅ 同步方法,線程安全 |
| 性能 | ⚡ 單線程下極快 | 🐢 同步開銷,慢 10-15% |
| 繼承關係 | 同繼承 AbstractStringBuilder | 同繼承 AbstractStringBuilder |
| JDK 版本 | 1.5 引入 | 1.0 即有 |
底層實現共性
- 內部維護
char[] value(JDK 9+ 為 byte[] + coder)。
- 擴容策略:
newCapacity = (oldCapacity << 1) + 2(約 2 倍)。
append/insert/delete 等操作均直接修改內部數組,不創建新對象,避免 String 不可變帶來的大量 GC。
選型決策樹
需要可變字符串?
├─ 多線程共享實例? → StringBuffer
└─ 單線程 / 線程局部? → StringBuilder(首選)
常見誤區
- ❌
String s = ""; for(...) s += x; → 每次循環隱式創建 StringBuilder + toString,極慢。
- ✅
StringBuilder sb = new StringBuilder(); for(...) sb.append(x); String s = sb.toString();
- ❌ 以為
StringBuffer 絕對安全:複合操作(如 if(sb.length()>0) sb.deleteCharAt(0))仍需外部同步。
String 對比
| 場景 | 推薦 |
| 少量拼接、常量 | String(編譯期優化) |
| 大量拼接、構建 SQL/JSON | StringBuilder |
| 多線程日志緩衝 | StringBuffer 或 ThreadLocal |