簡體   English   中英

Java 包裝類真的不可變嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM