String 為不可變對象,每次拼接 (+) 都會創建新對象、複製字符數組,頻繁拼接導致大量臨時對象、GC 壓力大、效能低落。StringBuilder (JDK 1.5+) 提供可變字符序列,單線程下高效拼接首選。
StringBuilder sb = new StringBuilder(); // 默認容量 16
StringBuilder sb = new StringBuilder(100); // 指定初始容量
StringBuilder sb = new StringBuilder("Hello"); // 從字符串初始化
sb.ensureCapacity(200); // 確保最小容量
int cap = sb.capacity(); // 當前容量
int len = sb.length(); // 當前長度
擴容策略:newCapacity = (oldCapacity + 1) * 2 (約 2 倍)。
| 方法 | 說明 | 返回值 |
|---|---|---|
append(x) | 追加任意類型 (toString) | this (鏈式調用) |
appendFormat(fmt, args) | 格式化追加 (C# 風格,Java 用 String.format 配合) | this |
insert(offset, x) | 指定位置插入 | this |
delete(start, end) | 刪除區間 [start, end) | this |
deleteCharAt(index) | 刪除單字符 | this |
replace(start, end, str) | 區間替換 | this |
reverse() | 反轉序列 | this |
charAt(index) | 獲取字符 | char |
substring(start, end) | 截取子序列 | String |
indexOf(str) / lastIndexOf(str) | 查找 | int |
toString() | 轉為不可變 String | String |
StringBuilder sb = new StringBuilder("Hello World!");
sb.append(" What a beautiful day."); // Hello World! What a beautiful day.
sb.insert(6, "Beautiful "); // Hello Beautiful World! What a beautiful day.
sb.delete(5, 12); // Hello World! What a beautiful day.
sb.replace(0, 5, "Hi"); // Hi World! What a beautiful day.
sb.reverse(); // !yad lufituaeb a taht !dlroW iH
public class AppendStringTest {
public static void main(String[] args) {
// String 拼接
String s = "";
long t1 = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) s += i;
long t2 = System.currentTimeMillis();
System.out.println("String 拼接耗時: " + (t2 - t1) + "ms"); // ~3000ms
// StringBuilder 拼接
StringBuilder sb = new StringBuilder();
long t3 = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) sb.append(i);
long t4 = System.currentTimeMillis();
System.out.println("StringBuilder 耗時: " + (t4 - t3) + "ms"); // ~5-15ms
}
}
結果:StringBuilder 快 **200+ 倍**,內存分配減少 99%+。
| 特性 | StringBuilder | StringBuffer |
|---|---|---|
| 線程安全 | 否 (無 synchronized) | 是 (所有方法 synchronized) |
| 效能 | 高 | 較低 (鎖開銷) |
| 適用場景 | 單線程、局部變量、高頻拼接 | 多線程共享字符串緩衝區 |
JDK 5 引入 StringBuilder 正是為了解決 StringBuffer 在單線程下的鎖性能損耗。
StringBuilder。toString()。StringBuffer 或 ThreadLocal。log.debug("user={}", user)。StringBuilder 是 Java 高效字符串構建的利器,掌握其容量機制、核心 API 與選型原則,能顯著提升吞吐量、降低 GC 壓力。