[英]Are Java wrapper classes really immutable?
Java Wrapper 類應該是不可變的。 這意味着一旦創建了一個對象,例如,
Integer i = new Integer(5);
它的值不能改變。 然而,做
i = 6;
是完全有效的。
那么,在這種情況下,不變性是什么意思? 這與自動裝箱/拆箱有關嗎? 如果是這樣,有沒有辦法阻止編譯器這樣做?
謝謝
i
是參考。 您的代碼將引用i
更改為指向不同的、同樣不可變的Integer
。
final Integer i = Integer.valueOf(5);
可能更有用。
不可變意味着對象狀態不能改變。 在您的情況下,您尚未更改對象new Integer(5)
,但您已將引用i
更改為指向另一個對象。 希望它很清楚:)
編譯器自動裝箱原始值,這意味着
Integer value = 6;
將被編譯為
Integer value = Integer.valueOf(6);
Integer.valueOf 將返回一個具有給定值的 Integer 實例。 在你的情況下, i
現在將引用 Integer(6) 而不是 Integer(5),Integer(5) 對象本身不會改變。
要看到這一點,您可以執行以下操作
Integer i = new Integer(5);//assign new integer to i
Integer b = i;//b refences same integer as i
i = 6;//modify i
System.out.println(i +"!="+b);
這將打印6!=5
,如果整數實例已被修改,它將打印6!=6
。
澄清這只是為了展示對 Integer 的賦值如何僅修改引用而不改變 Integer 實例本身。 正如用戶@KNU 指出的那樣,它並沒有證明或顯示 Integer 的不變性,據我所知,不變性只是由於其 API 中缺少修改方法以及 Integer.valueOf 返回的實例的要求而間接給出的緩存在一定范圍內。
i = 6
起作用的原因是自動裝箱正在攔截並將其轉換為i = new Integer(6)
。 因此,正如@Peter 所說,您現在指向一個新對象。
Integer i = new Integer(5);
i++; // i will become 6
其中i++
與i = new Integer( i.intValue() + 1);
java中的所有包裝類都是不可變的。 包裝類對象一旦創建就無法更改其值,即無法更改包裝在對象內部的值。 因為包裝類是作為原始數據類型的對象形式使用的,如果它們是可變的,運行時就會出現數據不一致的情況。 但是,您可以更改包裝類引用變量以保存另一個對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.