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

Java String 不變模式深度解析:強不變 vs 弱不變與 StringBuilder 差異

     編輯:程式設計疑難解答

Java 面試高頻考點:String 為何設計為不可變?什麼是「強不變」與「弱不變」?StringBuffer/StringBuilder 又有何不同?本文從記憶體模型、線程安全、效能三維度深度剖析。

核心定義

  • 強不變:物件建立後,狀態絕對不可改變,所有方法均回傳新物件。String、包裝類(Integer 等)屬此類。
  • 弱不變:物件內部狀態可能改變,但對外暴露的介面保持不變語義。典型如 StringBuilder(非線程安全)與 StringBuffer(線程安全)。

String 不變的三大設計動機

  1. 字串常量池複用:JVM 只儲存一份相同字面值,節省記憶體,前提是不可變。
  2. 線程安全:不可變物件天然線程安全,無需同步,適合多執行緒環境共享。
  3. HashCode 快取:hashCode() 只需計算一次快取,作為 HashMap Key 時效能極佳。

StringBuffer vs StringBuilder 選型指南

特性StringBufferStringBuilder
線程安全同步方法,安全非同步,不安全
效能較低(鎖開銷)高(單執行緒首選)
適用場景多執行緒字串拼接單執行緒、大量拼接

實戰建議

  • 編譯期常量拼接("a" + "b")編譯器自動優化為 "ab",無額外開銷。
  • 迴圈大量拼接務必用 StringBuilder,避免產生大量中間 String 物件觸發頻繁 GC。
  • API 設計時,參數型別優先用 String(不可變、安全),內部拼接用 StringBuilder,最後 toString() 回傳。
理解「不變模式」不只是為了面試,更是寫出高效、安全 Java 程式碼的基石。記住:不可變是特性,不是限制——善用它,才能駕馭它。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved