首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java StringBuffer 與 StringBuilder 深度解析:可變字串的選擇與效能

     編輯:Java 程式設計入門

Java StringBuffer 與 StringBuilder 深度解析:可變字串的選擇與效能

String 物件不可變,每次修改都會產生新物件。頻繁字串操作時,應使用 StringBuffer 或 StringBuilder——它們內部維護可變字元陣列,避免大量中間物件產生。

核心差異:執行緒安全 vs 效能

特性StringBufferStringBuilder
登場版本JDK 1.0JDK 1.5
執行緒安全是(方法同步)否(非同步)
效能較低較高(單執行緒下)
適用場景多執行緒環境共享字串緩衝區單執行緒、高頻字串操作

建議: 單執行緒優先用 StringBuilder;多執行緒共享才用 StringBuffer。

基本用法範例

StringBuffer sb = new StringBuffer("菜鳥教程官網:");
sb.append("www").append(".runoob").append(".com");
System.out.println(sb); // 菜鳥教程官網:www.runoob.com

StringBuffer 核心方法

修改字串內容

方法說明
append(String)追加字串(支援多型別重載)
insert(offset, data)指定位置插入
delete(start, end)刪除子字串 [start, end)
replace(start, end, str)替換子字串
reverse()反轉字元序列

查詢與存取(類 String)

方法說明
charAt(index)取得指定索引字元
indexOf(str) / lastIndexOf(str)搜尋子字串
substring(start) / substring(start, end)取得子字串(返回 String)
length()字元長度
capacity()當前容量(底層陣列大小)
ensureCapacity(min)確保最小容量
setLength(newLength)設定長度(截斷或擴充以 '\0' 填充)
setCharAt(index, ch)設定指定索引字元
toString()轉為 String 物件

StringBuilder 使用方式完全相同

API 幾乎一模一樣,僅移除 synchronized 關鍵字。直接替換類別名即可:

StringBuilder sb = new StringBuilder("Hello");
sb.append(" World").reverse();
System.out.println(sb); // dlroW olleH

效能實測參考

// 單執行緒追加 100萬次
long t1 = System.currentTimeMillis();
StringBuffer sbf = new StringBuffer();
for (int i = 0; i < 1_000_000; i++) sbf.append("a");
System.out.println("StringBuffer: " + (System.currentTimeMillis() - t1) + "ms");

long t2 = System.currentTimeMillis();
StringBuilder sbl = new StringBuilder();
for (int i = 0; i < 1_000_000; i++) sbl.append("a");
System.out.println("StringBuilder: " + (System.currentTimeMillis() - t2) + "ms");
// 典型結果:StringBuilder 快 2-3 倍

容量擴充機制

  • 預設初始容量 16 字元。
  • 不足時擴充為 (舊容量 + 1) * 2。
  • 可用建構子 new StringBuilder(100) 或 ensureCapacity() 預分配,減少擴充開銷。

最佳實踐總結

  1. 簡單拼接(<5 次)直接用 +,編譯器優化為 StringBuilder。
  2. 迴圈/大量拼接:明確使用 StringBuilder(單執行緒)或 StringBuffer(多執行緒)。
  3. 預估最終長度可用建構子指定初始容量。
  4. 需轉 String 時呼叫 toString()。
  5. Java 9+ 引入 String.join()、Collectors.joining() 等現代 API,優先考慮。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved