簡體   English   中英

String如何實現不變性?

[英]How String achieves immutability?

在其中一次采訪中,我被問到“字符串是如何變為不可變的”? 由於我不確定答案,我沒有回復。 我后來問過面試官這個問題。 答案是String類是最終的,它是如何實現不變性的。

這是正確的答案嗎? 如果是,甚至StringBuffer也被標記為最終類。 那為什么StringBuffer不可變?

它是以下組合:

  1. 字段是私有的 - 因此您無法直接更改它們。
  2. 沒有提供set方法 - 因此它們也不能間接改變。
  3. Stringfinal - 所以你不能添加可變性(即setter等)。

不,這不是正確的答案。 String實現了不變性,因為它不提供任何方法來更改其內部內容。 因此,您可以實例化String對象,為其指定引用,但在初始化后不能更改其內容。

字符串是不可變對象。

按照以下准則使類不可變:

  • 確保不能覆蓋類
  • 使類final ,或使用靜態工廠並保持構造函數私有
  • 將字段設為privatefinal
  • 不提供任何可以以任何方式改變對象狀態的方法 - 不僅僅是setXXX方法,而是任何可以在類具有任何可變對象字段時改變狀態的方法,那么它們必須在類之間傳遞時進行防御性復制。它的來電者
  • 強制調用者完全在一個步驟中構造一個對象,而不是使用無參數構造函數和后續調用setXXX方法(即避免Java Beans約定)

final關鍵字與immutability不同。 String是不可變的,因為它沒有定義允許用戶更改其內容的任何方法, 並且它是最終的,從而消除了更改子類中的內容的可能性。

制作像List實例變量final這樣的東西仍然允許你改變它的內容,使它變得可變。

最終意味着它無法從中衍生出來。 這並不能賦予不變性

通過封裝實現不變性,並且不提供任何修改內部保持的字符數組的方法。 即沒有方法可以修改內部字段。

最初為空的字符串池由String類私有維護。

您應該查看String的JavaDoc: public native String intern();

看到:

使類不可變的通常方法是確保:

  • 所有的領域都是私人的;
  • 施工后無法修改字段;
  • 它是最終的(因此擴展不能破壞不變性)。

String是一個有點特殊,在它實際上並不遵循這一程序在Sun / Oracle實施至少。 該實現具有可變字段,其中它緩存對象的哈希碼。 因此,雖然有一個方法可以更改對象的內部狀態( hashCode ),但此狀態更改不會以任何方式更改對象的行為。 hashCode任何后續調用都會運行得更快,但結果不會有任何不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM