我很困惑,爲什麼Integer和int可以在Java中互換使用,即使一個是原始類型而另一個是對象?爲什麼Integer和int可以互換使用?
例如:
Integer b = 42;
int a = b;
或者
int d = 12;
Integer c = d;
我很困惑,爲什麼Integer和int可以在Java中互換使用,即使一個是原始類型而另一個是對象?爲什麼Integer和int可以互換使用?
例如:
Integer b = 42;
int a = b;
或者
int d = 12;
Integer c = d;
張貼文章的第一幾句話形容得很好:
你不能把一個int(或其他原始值)到一個集合。集合只能保存對象引用,所以你必須將原始值裝入適當的包裝類(在int情況下爲Integer)。當你把對象從集合中取出時,你得到了你放入的Integer;如果您需要int,則必須使用intValue方法取消Integer。所有這些拳擊和拆箱都是一件痛苦的事情,並且會讓你的代碼混亂不堪。自動裝箱和取消裝箱功能可自動執行此過程,消除疼痛和混亂。
這基本上是簡而言之。它使您可以利用靈活性的集合框架,而無需親自完成工作。
其主要缺點是它會混淆新的程序員,並且如果不能正確理解和使用,會導致混亂/混亂的代碼。
Java支持autoboxing和自動換原始值到對象和解開對象對於某些類型的原始值,比如char
- Character
,int
- Integer
,double
-Double
等
來自Oracle Documentation的說明:
那麼,什麼時候應該使用自動裝箱和取消裝箱?僅當參考類型和基元之間存在「阻抗不匹配」時才使用它們,例如,當您必須將數值放入集合中時。對科學計算或其他性能敏感的數字代碼使用自動裝箱和拆箱並不合適。整數不是int的替代;自動裝箱和取消裝箱模糊了基本類型和引用類型之間的區別,但它們並沒有消除它。
由於自動裝箱和autounboxing http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html
這就是所謂的AutoBoxing的。這將解釋到底是什麼。
java語言規範指出java虛擬機必須執行automatic boxing/unboxing for integers and a few other types。
使用int
和Integer
「可互換」稱爲autoboxing。此功能是在Java 5中引入的。在此之前,您的示例代碼不會編譯。相反,你會寫這樣的事:
Integer b = Integer.valueOf(42); // or new Integer(42);
int a = b.intValue();
或
int d = 12;
Integer c = Integer.valueOf(d); // or new Integer(d);
這是相當冗長,這就是爲什麼引入自動裝箱。讓編碼器變得更加簡單,這對編譯器來說有點神奇。
從技術上講,int
和Integer
本身是不可互換的,一個不能用於其他需要的地方。但是,自動裝箱允許兩者之間的隱式轉換。
作爲一個方面說明,有一種情況下自動裝箱(特別是拆箱)失敗。如果你的代碼試圖autounbox空值,你會得到一個NullPointerException
在運行時,例如:
Integer b = null;
int a = b; // NullPointerException here!
只是要注意的...