| 特性 | String | StringBuffer | StringBuilder |
|---|---|---|---|
| 可變性 | 不可變 | 可變 | 可變 |
| 線程安全 | 不可變天然安全 | 同步方法,安全 | 非同步,不安全 |
| 性能 | 頻繁修改差 | 中等 | 單線程最優 |
| 適用場景 | 常量、少量拼接 | 多線程頻繁修改 | 單線程頻繁修改 |
// 空緩衝區,默認容量 16
StringBuffer sb1 = new StringBuffer();
// 指定初始內容
StringBuffer sb2 = new StringBuffer("abc");
// 指定初始容量(避免擴容開銷)
StringBuffer sb3 = new StringBuffer(100);
// 相互轉換
String str = "hello";
StringBuffer sb4 = new StringBuffer(str); // String → StringBuffer
String str2 = sb4.toString(); // StringBuffer → String
StringBuffer sql = new StringBuffer();
sql.append("SELECT * FROM user WHERE ")
.append("name = '").append(userName).append("'")
.append(" AND pwd = '").append(password).append("'");
鏈式調用返回 this,避免創建中間 String 對象,SQL 拼接首選。
StringBuffer sb = new StringBuffer("TestString");
sb.insert(4, "False"); // 結果: "TestFalseString"
sb.delete(1, 4); // 刪除索引 [1,4) 區間字符 sb.deleteCharAt(0); // 刪除指定索引單字符
new StringBuffer("abc").reverse(); // "cba"
sb.setCharAt(1, 'D'); // 單字符替換 sb.replace(0, 3, "XYZ"); // 區間替換
將底層字符數組縮減至當前長度,釋放未使用內存。
new StringBuffer(estimatedSize) 減少擴容複製// 簡化版擴容邏輯
private void expandCapacity(int minimumCapacity) {
int newCapacity = (value.length + 1) * 2;
if (newCapacity < minimumCapacity) newCapacity = minimumCapacity;
if (newCapacity < 0) throw new OutOfMemoryError();
value = Arrays.copyOf(value, newCapacity);
}
每次擴容約為 2 倍,預設初始 16 字符,頻繁擴容會產生大量臨時數組增加 GC 壓力。