[英]How String achieves immutability?
在其中一次采訪中,我被問到“字符串是如何變為不可變的”? 由於我不確定答案,我沒有回復。 我后來問過面試官這個問題。 答案是String類是最終的,它是如何實現不變性的。
這是正確的答案嗎? 如果是,甚至StringBuffer也被標記為最終類。 那為什么StringBuffer不可變?
它是以下組合:
set
方法 - 因此它們也不能間接改變。 String
是final
- 所以你不能添加可變性(即setter等)。 不,這不是正確的答案。 String實現了不變性,因為它不提供任何方法來更改其內部內容。 因此,您可以實例化String對象,為其指定引用,但在初始化后不能更改其內容。
字符串是不可變對象。
按照以下准則使類不可變:
final
,或使用靜態工廠並保持構造函數私有 private
和final
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.