Java中的mutable和immutable對象實例講解

1.mutable(可變)和immutable(不可變)類型的區別

可變類型的對象:提供了可以改變其內部數據值的操作,其內部的值可以被重新更改。

不可變數據類型:其內部的操作不會改變內部的值,一旦試圖更改其內部值,將會構造一個新的對象而非對原來的值進行更改。

2.mutable和immutable類型的優缺點

mutable immutable 優點 可變類型會減少數據的拷貝次數,從而其效率 要高於immutable 由於內部數據不可變,所以對其頻發修改會產生大量的臨時拷貝,浪費空間 缺點 可變類型由於其內部數據可變,所以其風險更大 內部數據的不可變導致其更加安全,可以用作多線程的共享對象而不必考慮同步問題 3.舉例

Java中的String類的對象都是典型的immutable數據類型,一個String對象一旦被new出來,那麼其代表的數據便不可被重新assigned;StringBuilder類的對象卻是mutable的數據類型,當一個StringBuilder對象被創建出來之後,其內部的值是可以通過某些內部方法進行改變的。

通過snapshot diagram對兩種類型進行分析:

Java中的mutable和immutable對象實例講解

Java中的mutable和immutable對象實例講解

通過snapshot可以看到:當試圖更改String的內部數據時,s並不在指向原來的對象,而是指向了一個新的String對象。

Java中的mutable和immutable對象實例講解

Java中的mutable和immutable對象實例講解

通過snapshot可以看到:當更改sb內部數據的時候,並不像String類那樣重新產生了一個新的對象,而是直接更改了原對象的內部數據,sb的引用並未更改。

4.如何構造一個immutable類

1)確保fileds中的成員都被private final修飾:private保證內部成員不會被外部直接訪問;final確保在成員被初始化之後不會被重新assigned。

2)不提供改變成員的方法,例如setX

3)使用final修飾自定義類,確保類中的所有方法不會被重寫。

4)如果類中的某成員為mutable類型,那麼在初始化該成員或者企圖使用get方法從外部對其進行觀察的時候,應該使用深度拷貝,確保類immutable。


分享到:


相關文章: