屬性變更時不新建對象的對象,如StringBuiler,可以將其中儲存的字串看作屬性,呼叫StringBuilder.append(String str)追加字串時,是在已有StringBuilder物件的基礎上進行的,沒有新建物件。
基本資料類型的包裝類別以及String類別以外的幾乎全部類別的物件都是可變物件。
屬性變更時必須新建對象的對象,如String,已有"String str='abc'",再次賦值"str='efg'",此時新建一個String物件儲存“efg”,str指向這個新建的物件。
基本資料類型的包裝類別以及String類別的物件都是不可變物件。
#不可變物件代表記憶體中的一個穩定區域,多個引用變數指向同一區域,當一個引用變數嘗試改變對象的內容時,不會改變原對象的內容,而是新建一個對象,這樣就保證了資料的穩定,因此不可變對象通常用在需要保持資料穩定的情況。
在更新可變對象的屬性時不會新建對象,節省記憶體空間,因此可變對象主要用在屬性變化頻繁的情況,如計數器,需要建立統計對象與統計結果之間的映射關係,因此建構一個Map集合。 Integer對像是不可變對象,不適用用來儲存統計結果,應該採用一個可變對象來儲存統計結果,這裡採用數組,當然也可以是自訂對象,其中有一個int屬性用來計數:
public void test01() { String str = "abc efe hig klm nop qrs"; String[] arr = str.split(" "); HashMap<String, int[]> map = new HashMap<String, int[]>();for (String x : arr) {int[] count = map.get(x);if (count != null) count[0]++;elsemap.put(x, new int[] { 1 }); } }
不可變物件有幾個好處:
1. 記憶體分配固定,不需要擴充
2. 可以任意複製多份,不同執行緒之間不需要加鎖解鎖
這就是函數式程式設計中的「變數不變」的特性。其他當然還有一些函數式程式設計提倡的好處,例如程式碼清晰等等,但這個就見仁見智了。
以上是Java中的可變物件與不可變物件比較分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!