中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中mutable對象和immutable對象有什么區別

發布時間:2021-06-11 09:54:34 來源:億速云 閱讀:511 作者:小新 欄目:開發技術

這篇文章主要介紹了Java中mutable對象和immutable對象有什么區別,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

Java mutable對象和immutable對象的區別

今天讀jdk源碼中Map.java時看到一句話:

great care must be exercised if mutable objects are used as map keys;

第一次知道mutable對象這個概念,google了一下,維基百科定義如下:

“In object-oriented and functional programming, an immutable object (unchangeable[1] object) is an object whose state cannot be modified after it is created.[2] This is in contrast to a mutable object (changeable object) , which can be modified after it is created. In some cases, an object is considered immutable even if some internally used attributes change but the object's state appears to be unchanging from an external point of view. For example, an object that uses memoization to cache the results of expensive computations could still be considered an immutable object.”

在面向對象和函數式編程中,一個immutable對象(不可變對象)是指一旦創建之后狀態不可改變的對象。

mutable對象(可變對象)是指創建之后也可以修改的對象。

在有些情況下,對象也被認為是不可變的(immutable),即,一個對象包含的內部使用的屬性改變了,但從外部看對象的狀態并沒有改變。

例如,一個使用memoization來緩存復雜計算結果的對象仍然被看作是不可變(immutable)對象.

在面向對象編程中,String 以及其他的具體對象都被看作是不可變(immutable)對象,以提高可讀性和運行效率。

不可變對象有幾個優點:

線程安全

易于理解

比可變對象有更高的安全性

Java中不可變對象的經典例子就是String類的實例:

String s = "ABC";
s.toLowerCase();

toLowerCase()方法不會改變s中包含的數據“ABC”。而是創建一個新的String對象并將其初始化為“abc”,然后返回這個新對象的引用。

盡管String類聲明中沒有提供讓它成為不可變對象的語法,但是,String類的方法中沒有方法去改變一個String包含的數據,這就使得它是不可變的。

Java中關鍵字final用于聲明原始數據類型(primitive types)和對象引用為不可變對象,但是它不能使對象本身變為不可變對象。

原始數據類型(primitive types)變量(int, long, short等)定義之后還可以再重新賦值,可以使用final阻止這樣的賦值。

int i = 42; //int is of primitive type
i = 43; // OK
 
final int j = 42;
j = 43; // does not compile. j is final so can't be reassigned

僅僅使用final關鍵字還不能讓引用類型(reference types)成為不可變對象,final只能阻止重新賦值。

final MyObject m = new MyObject(); //m is of reference type
m.data = 100; // OK. We can change state of object m (m is mutable and final doesn't change this fact)
m = new MyObject(); // does not compile. m is final so can't be reassigned

原始類型包裝類(primitive wrappers)(Integer,Long, Short, Double, Float, Character, Byte, Boolean)也都是不可變的。

Java mutable 和 immutable類型

含義解釋

immutable : variables that are assigned once and never reassigned.

mutable : When you assign to a variable or a field, you're changing where the variable's arrow points. You can point it to a different value. When you assign to the contents of a mutable value – such as an array or list – you're changing references inside that value.

基本類型及其封裝對象類型都是不可變的

圖形化解釋 Snapshot Diagram

mutable:

Java中mutable對象和immutable對象有什么區別

immutable:

Java中mutable對象和immutable對象有什么區別

舉例

例如String和StringBuilder:

1. String是immutable的,每次對于String對象的修改都將產生一個新的String對象,而原來的對象保持不變。

2. StringBuilder是mutable,因為每次對于它的對象的修改都作用于該對象本身,并沒有產生新的對象。

如何保證自己創建的類是immutable類

  • 所有成員都是private final。

  • 不提供對成員的改變方法,setXX

  • 確保所有的方法不會被重寫。手段有兩種:使用final Class(強不可變類),或者將所有類方法加上final(弱不可變類)。

  • 如果某一個類成員不是原始變量(例如int,double)或者不可變類,必須通過在成員初始化或者使用get方法時要通過深度拷貝方法,來確保類的不可變。

優缺點

使用不可變類型,對其頻繁修改會產生大量的臨時拷貝(需要垃圾回收) ;

可變類型最 少化拷貝以提高效率。

使用可變數據類型,可獲得更好的性能 ,也適合于在多個模塊之間共享數據 。例如全局變量。

不可變類型更“安全”, 在其他質量指標上表現更好。

對可變類型可能造成的風險,我們通過防御式拷貝(深度拷貝),給客戶端返回一個全新的可變類型的對象,大部分時候該拷貝不會被客戶端修改, 可能造成大量的內存浪費。

深度拷貝

當只是引用傳遞或者根據對象的值創建新的值,稱為“淺復制”,當原對象的發生改變時,根據上面方式創建的新對象的也會隨之改變;

而如果采用深度復制,那是真正的復制了一份新的對象,新對象的與原對象不存在任何關聯,原對象發生改變不會影響新對象。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Java中mutable對象和immutable對象有什么區別”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安化县| 松滋市| 仁寿县| 都匀市| 河津市| 商河县| 济源市| 长沙市| 弋阳县| 瓦房店市| 南漳县| 通江县| 明溪县| 新巴尔虎左旗| 玉山县| 天水市| 华亭县| 蛟河市| 南召县| 贵德县| 鄯善县| 长海县| 北安市| 依兰县| 旌德县| 资溪县| 慈利县| 金门县| 武强县| 新河县| 交城县| 皋兰县| 石屏县| 永丰县| 盘山县| 丘北县| 固镇县| 托里县| 北海市| 莲花县| 综艺|