資料類型
int是基本資料類型,Integer是int的包裝類,屬于引用類型
初始值
int的初始值為0,Integer的初始值為null
存儲位置
int是直接存儲在棧中的,Integer是引用資料類型,存儲在棧中的是它的記憶體位址,實際的對象存儲在堆中
比較
int比較的是兩個變量的值是否相等,Integer比較的是記憶體位址是否相同
傳遞方式
int在傳遞參數時都是按值傳遞,Integer按引用傳遞,傳遞的是對象的記憶體位址
衍生一下:自動裝箱/自動拆箱
從Java5開始引入了自動裝箱/自動拆箱機制,二者可以互相轉換
public class T {
public static void main(String[] args) {
//自動裝箱
Integer a = 10;
//自動拆箱
int b = a;
}
}
自動裝箱:就是自動将基本資料類型轉換為引用類型
自動拆箱:就是自動将引用類型轉換為基本資料類型
自動裝箱實作原理
當我們給一個Integer對象賦一個int值時,會調用Integer類的valueOf()方法,通過閱讀源碼,我們可以得到這樣的結論:如果整數的值在-128~127之間,就不會new新的Integer對象,而是直接引用常量池中的Integer對象,如果不在這個範圍内,則會new新的Integer對象。
public static Integer valueOf(String s) throws NumberFormatException {
return Integer.valueOf(parseInt(s, 10));
}
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
注意:除了double和float沒有使用緩存,其它6種基本資料類型都使用了緩存政策
自動拆箱實作原理
當我們給一個int變量賦一個Integer對象時,其實調用的時Integer.intValue()方法,這個很簡單,直接傳回value值。
public int intValue() {
return value;
}