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

Java 字串處理核心:String、StringBuffer、StringBuilder 差異、效能與選型指南

     編輯:Java 綜合教學

Java 字串處理核心:String、StringBuffer、StringBuilder 差異、效能與選型指南

字串操作是 Java 開發高頻場景,理解三者機制差異能避免效能陷阱。本文從不可變性、執行緒安全、效能基準三個維度深度對比。

核心特性對比

特性StringStringBufferStringBuilder
可變性不可變可變可變
執行緒安全天然安全(不可變)同步方法,安全非同步,不安全
效能頻繁修改極差中等(鎖開銷)最佳(無鎖)
繼承關係final classextends AbstractStringBuilderextends AbstractStringBuilder
JDK 版本1.01.01.5

底層機制解析

  • String: 底層 final char[] value(JDK 9+ 改為 byte[] + coder)。任何修改(concat、replace、substring)都會建立新物件、複製陣列。
  • StringBuffer/Builder: 共用 AbstractStringBuilder,內部維護可擴容 char[]/byte[],append/insert/delete 直接操作陣列,擴容時按 2 倍+2 複製。

效能實測(百萬次 append)

// String: ~5000ms (極慢,產生大量臨時物件觸發 GC)
String s = "";
for (int i = 0; i < 1_000_000; i++) s += "a";

// StringBuffer: ~15ms (同步鎖開銷)
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 1_000_000; i++) sb.append("a");

// StringBuilder: ~5ms (最快)
StringBuilder sbl = new StringBuilder();
for (int i = 0; i < 1_000_000; i++) sbl.append("a");

結論: StringBuilder > StringBuffer > String(頻繁修改場景)。

選型決策樹

  1. 字串極少修改或作為鍵值/常量 → String
  2. 單執行緒、大量拼接/修改 → StringBuilder(預設首選)
  3. 多執行緒共享字串緩衝區 → StringBuffer(或 ThreadLocal 避免鎖)
  4. 字串池優化:String.intern()、"literal" 自動入池。

常見誤區

誤區真相
編譯器會自動優化 + 為 StringBuilder僅單一表達式內(如 s = "a" + "b" + c),循環/多語句不會
StringBuilder 非線程安全不可用單執行緒或 ThreadLocal 範圍內完全安全且更快
StringBuffer 已過時未過時,多執行緒共享場景仍有價值

JDK 9+ 緊湊字串

JDK 9 引入 Compact Strings:String 內部改為 byte[] + byte coder(LATIN1/UTF-16),純 ASCII 字串記憶體減半,StringBuilder/Buffer 同步更新。無需代碼變更即享受效能紅利。

選對工具,字串處理不再是效能黑洞。

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