首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

StringBuilder vs StringBuffer:線程安全與性能的取捨,JDK 5+ 首選 StringBuilder

     編輯:程式設計綜合問答

核心區別一覽

特性StringBufferStringBuilder
線程安全✅ 所有公共方法 synchronized❌ 非線程安全
性能較低(鎖開銷)高(無鎖)
引入版本JDK 1.0JDK 1.5
繼承關係同父類 AbstractStringBuilder同父類 AbstractStringBuilder
API 兼容性幾乎完全一致幾乎完全一致

選型原則

  • 單線程 / 方法局部變量:無腦用 StringBuilder,性能優、無鎖競爭
  • 多線程共享實例:用 StringBuffer,或手動同步 StringBuilder(synchronized(sb) { sb.append(...); })
  • API 兼容舊代碼:舊項目已大量用 StringBuffer 且無性能瓶頸,可不改

常用方法(兩者一致)

append(String)      // 追加,返回 this 支持鏈式
insert(int, String) // 指定位置插入
delete(int, int)    // 刪除區間
reverse()           // 反轉
toString()          // 生成 String
setLength(int)      // 截斷/擴容
capacity()          // 當前容量
ensureCapacity(int) // 預分配

性能實測(百萬次追加)

// StringBuilder ~15ms
// StringBuffer ~45ms (約 3 倍,鎖開銷)
StringBuilder sb = new StringBuilder(1_000_000); // 預分配避免擴容
for (int i = 0; i < 1_000_000; i++) sb.append('a');
String s = sb.toString();

底層原理

  • 內部維護 char[] value(JDK 9+ 改為 byte[] + coder 緊湊字符串)
  • 擴容策略:newCapacity = (oldCapacity + 1) * 2
  • toString() 在 JDK 9+ 共享底層數組(String(StringBuilder) 構造函數傳遞 value 引用),無拷貝開銷

總結

JDK 5 後新代碼首選 StringBuilder。只有明確多線程共享緩衝區時才用 StringBuffer。日常拼接字符串、構建 SQL、生成 JSON、日志構建等場景,new StringBuilder().append(...).toString() 是標準模式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved