可變資料型別(mutable)與不可變資料型別(immutable)總結

HIT2022111897發表於2024-05-27

一、基本概念

不可變資料型別: 當該資料型別的對應變數的值發生了改變,那麼它對應的記憶體地址也會發生改變,對於這種資料型別,就稱不可變資料型別。其中基本資料型別都是不可變資料型別,例如int,如果一個int型別的資料發生改變,那麼它指向了記憶體中的另一個地址,但是需要注意的是java快取了所有-128-127的值。
可變資料型別 :當該資料型別的對應變數的值發生了改變,那麼它對應的記憶體地址不發生改變,對於這種資料型別,就稱可變資料型別,當可變資料型別改變時它實際上是更改了記憶體中的內容。

二.可變與不可變資料型別分別有什麼優勢?

1)可變資料型別:

由於對不可變資料型別進行修改會產生大量的臨時複製,很佔用空間,相比之下可變資料型別可以將複製最少化從而提高效率。

一個程式較多的的使用可變資料型別,會獲得更好的效能。

這種型別也適合於在多個模組之間共享資料。

2)不可變資料型別:

不可變型別更安全,使用者或其他人訪問時,對類中的元素不會進行修改,從而保證程式的正確性,在專案中可以更好地儲存。

存在對一個物件的多次引用時,採用不可變型別是明智的,否則對該物件修改時,同時會改變其他幾個類的引用,會出現大錯。

三.透過final修飾可變型別為不可變型別

透過final修飾的類有以下三個特徵:無法被繼承、無法被覆蓋以及重寫、無法改變其引用。

四、String&StringBuilder看可變不可變

String:不可變資料型別
StringBuilder:可變資料型別

String s = "a";  s = s + "b";
//其中s指向了兩個記憶體地址 ,一個地址中是“a” 另一個是 “ab”

StringBuilder sb = "a";   sb = "ab";
//StringBuilder是可變資料型別,更改它的時候sb始終指向一個位置

更改物件的值
不可變資料型別是在重新將引用指向一個新地址,新地址中為更改後的值。 可變資料型別則在原來的地址上直接更改物件值。

總的來說,基本資料型別和物件資料型別的變數均代表在棧記憶體中的一段儲存空間,但不同的是,基本資料型別變數的對應空間直接儲存資料,而物件資料型別變數的對應空間則儲存其在堆記憶體中的地址,而在堆記憶體中儲存資料。這就導致了二者的引用型別不同。

相關文章