在 Java 中頻繁修改字符串時,String 的不可變特性會產生大量臨時對象,嚴重影響性能。StringBuilder 與 StringBuffer 提供可變字符序列,是高效字符串操作的首選。
String 拼接會創建新對象:
String s = "hello";
s += "world"; // 實際創建了 "helloworld" 新對象,原 "hello" 成垃圾
StringBuilder 內部維護字符數組,擴容時才複製,避免頻繁創建對象。
StringBuilder sb = new StringBuilder("hello");
sb.append("world"); // 直接在內部數組擴展,無新對象
append(x):追加內容,返回自身(鏈式調用)insert(offset, x):指定位置插入delete(start, end):刪除區間字符reverse():反轉序列toString():轉為 Stringpublic static void main(String[] args) {
StringBuilder sb = new StringBuilder("jaewkjldfxmopzdm");
for (int i = sb.length() - 3; i > 0; i -= 3) {
sb.insert(i, ",");
}
System.out.println(sb); // jae,wkj,ldf,xmo,pzd,m
}
StringBuffer():空序列,初始容量 16StringBuffer(String str):包含指定字符串StringBuffer(int capacity):指定初始容量StringBuffer sb = new StringBuffer("test");
sb.append(" String Buffer"); // test String Buffer
StringBuffer sb2 = new StringBuffer("數字");
for (int i = 0; i <= 9; i++) sb2.append(i); // 數字0123456789
sb2.delete(8, sb2.length()).insert(0, new char[]{'a','b','c'}); // abc數字01
System.out.println(sb2.reverse()); // 10cba數字
| 特性 | StringBuilder | StringBuffer |
|---|---|---|
| 線程安全 | 否 | 是(方法同步) |
| 性能 | 高 | 較低 |
| 適用場景 | 單線程、高頻字符串操作 | 多線程共享字符串緩衝區 |
原則:優先使用 StringBuilder(JDK 5+ 引入),僅在多線程環境下共享緩衝區時使用 StringBuffer。