天天看點

8 int和Integer的差別

資料類型

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;
}