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

深度解析 String、StringBuffer 與 StringBuilder:效能、線程安全與最佳實踐

     編輯:Java 相關知識

在 Java 字串處理中,String、StringBuffer、StringBuilder 三者關係密切卻差異巨大。選擇錯誤不僅影響效能,更可能引發併發問題。本文從底層原理、API 詳解、效能實測三個維度,助你建立清晰的選型判斷力。

為什麼 String 效能較差?

String 物件不可變。每次拼接、替換等操作都會產生新物件,舊物件等待 GC 回收。大量操作時會產生海量臨時物件,導致記憶體抖動與 GC 頻繁觸發,嚴重拖慢效能。

StringBuffer:線程安全的可變字串

  • 內部以 char[] 陣列儲存,預設容量 16 字元,不足自動擴容(JDK 1.5 後為 1.5 倍 + 1)。
  • 核心方法(append、insert、delete 等)皆以 synchronized 修飾,保證多線程安全。
  • 適用於多線程環境下頻繁修改字串的場景。

StringBuilder:高效能的非線程安全替代者

  • API 與 StringBuffer 几乎完全一致,繼承自 AbstractStringBuilder。
  • 方法無 synchronized 修飾,單線程下效能約比 StringBuffer 高 10%~15%。
  • 適用於單線程或已由外部同步機制保護的高頻字串操作。

核心 API 速查表

方法說明範例
append(x)尾部追加內容sb.append("abc").append(123)
insert(offset, x)指定位置插入sb.insert(3, "xyz")
delete(start, end)刪除區間字元 [start, end)sb.delete(1, 4)
deleteCharAt(index)刪除單一字元sb.deleteCharAt(3)
setCharAt(index, ch)替換指定位置字元sb.setCharAt(3, 'z')
reverse()反轉字串sb.reverse()
toString()轉為 String 物件String s = sb.toString()

效能實測:拼接 10,000 次 26 字母

String      : 5,287 ms
StringBuffer:     3 ms
StringBuilder:    2 ms

差距隨次數增長呈指數級擴大。30,000 次時 String 超過 35 秒,而 StringBuilder 僅需 8 毫秒。

選型決策樹

  1. 操作少量、固定字串 → String(可讀性最佳)
  2. 單線程、大量拼接/修改 → StringBuilder(效能王者)
  3. 多線程共享、大量修改 → StringBuffer(安全第一)

進階提示

  • 編譯器會將 String s = "a" + "b" + c; 自動優化為 StringBuilder 操作,但循環內拼接不會優化,請手動建立 Builder。
  • Java 9+ 引入 String.join()、StringBuilder.append() 多參數重載,進一步簡化代碼。
  • 三者皆實作 CharSequence 介面,可作為方法參數類型提高靈活性。

掌握三者差異,是寫出高效、穩健 Java 代碼的基礎功夫。下次寫字串拼接前,請先問自己:「這裡有多線程嗎?操作頻率如何?」

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