| 特性 | StringBuffer | StringBuilder | String |
| 線程安全 | 同步方法,線程安全 | 非同步,非線程安全 | 不可變,天然線程安全 |
| 性能 | 較低(同步開銷) | 最高(JDK 5+ 推薦) | 拼接性能最差 |
| 適用場景 | 多線程環境 | 單線程/局部變量(推薦) | 常量、少量拼接 |
核心構造方法
// 默認容量 16
StringBuffer sb1 = new StringBuffer();
// 指定初始容量,減少擴容次數
StringBuffer sb2 = new StringBuffer(100);
// 從字符串初始化,容量 = 長度 + 16
StringBuffer sb3 = new StringBuffer("Builder.com");
常用操作方法
追加內容
StringBuilder sb = new StringBuilder();
sb.append("B").append("u").append("i").append("l").append("d").append("er").append(".com");
// 鏈式調用,只創建一個對象
System.out.println(sb.toString()); // Builder.com
append 有 13 個重載,支持所有基本類型、對象、字符數組等。
容量管理
StringBuilder sb = new StringBuilder();
sb.ensureCapacity(100); // 確保最小容量
System.out.println(sb.capacity()); // 當前分配容量
System.out.println(sb.length()); // 實際字符長度
sb.setLength(10); // 截斷或填充空字符
sb.trimToSize(); // 釋放多餘容量(JDK 17+)
字符操作
StringBuilder sb = new StringBuilder("Hello World");
char c = sb.charAt(6); // 'W'
sb.setCharAt(6, 'J'); // "Hello Jorld"
String sub = sb.substring(0, 5); // "Hello" (不影響原對象)
sb.insert(6, "Java "); // "Hello Java World"
sb.delete(5, 10); // "HelloWorld"
sb.replace(0, 5, "Hi"); // "Hi World"
sb.reverse(); // "dlroW olleH" - 反轉神器
數據輸出
// 獲取字符數組副本
char[] chars = new char[sb.length()];
sb.getChars(0, sb.length(), chars, 0);
// 寫入 Writer(高效輸出)
sb.appendTo(writer); // JDK 17+,避免 toString() 創建中間字符串
性能對比實測
// 10萬次拼接測試
int N = 100_000;
long t1 = System.nanoTime();
String s = "";
for (int i = 0; i < N; i++) s += "a";
System.out.println("String: " + (System.nanoTime() - t1) / 1e6 + " ms");
long t2 = System.nanoTime();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) sb.append("a");
System.out.println("StringBuilder: " + (System.nanoTime() - t2) / 1e6 + " ms");
// 典型結果:
// String: ~15000 ms (O(N²))
// StringBuilder: ~5 ms (O(N))
最佳實踐總結
- 局部變量拼接首選 StringBuilder:非線程共享,性能最優
- 預估容量:
new StringBuilder(estimatedSize) 減少擴容
- 避免在循環中使用 String +:編譯器優化有限,複雜循環無法優化
- 日誌/輸出場景:直接傳遞
StringBuilder 給 appendTo() 或 Writer
- 線程共享緩衝區:使用
StringBuffer 或 ThreadLocal
內部原理洞察
- 底層維護
char[] value(JDK 9+ 為 byte[] + coder)
- 擴容策略:
newCapacity = (oldCapacity + 1) * 2
toString() 在 JDK 9+ 創建新 String 共享底層數組(無複製)
掌握 StringBuilder 正確用法,是 Java 開發者必備的基本功,能避免無數隱性性能陷阱。
- 上一篇文章: Java 正則表達式四大核心功能實戰指南
- 下一篇文章: Java 開發為何需要 UML:從代碼混亂到架構清晰
Copyright ©
程式碼之家 All Rights Reserved