關於Integer面試的一個問題

gnng發表於2019-03-04

簡介:Integer是Java常用類,關於它的面試題層出不窮,在這裡總結一下。

1.Integer和int的區別和聯絡?

1.int是基本資料型別,預設值為0,佔記憶體4個位元組。
2.Integer是引用型別,預設值為null。
3.Integer和int之間相互轉換存在自動拆裝箱的過程。
複製程式碼

2.程式碼如下

public static void main(String[] args) {
    Integer a = 200;
    Integer b = 200;
    System.out.println(a == b);
    System.out.println(a.equals(b));
}
上述程式執行的結果:
false
true
解析:Integer預設的數字快取區間為-128~127[a],當數字在這個區間的時候,Integer a = 200;直接從IntegerCache中讀取資料,不會建立新的物件(類似於字串常量池),如果超出這個區間[a]就會構造新的Integer物件。"=="是引用比較,"equals"是物件的值比較(Integer重寫了equals方法),a,b是不同的物件,==比較為false,他們的值相同都為200,equals為true。
複製程式碼

重點

特例:上述執行程式可能會有相反的結果,System.out.println(a == b)也可能為true。

解析:

可以通過修改JVM啟動引數修改IntegerCache上限(-XX:AutoBoxCacheMax=250),Java程式啟動時,會載入rt.jar這個核心包,rt.jat裡面的Integer自然也被載入到JVM中,Integer中有個IntegerCache快取,描述如下: 

IntegerCache有一個靜態程式碼塊,JVM在載入這個類的時候會優先載入靜態程式碼塊。當JVM程式啟動完畢後-128~127之間的數字就會被快取起來,呼叫valueOf方法的時候,如果是在這個區間的數字直接從快取中取,超過這個範圍就只能構造新的Integer物件。
複製程式碼

注意

使用Oracle/Sun JDK 6,在server模式下,使用-XX:AutoBoxCacheMax=NNN引數即可將Integer的自動快取區間設定為[-128,NNN],下邊界固定為-128,不可配置。

在設定了-XX:+AggressiveOpts啟動引數後,AutoBoxCacheMax的預設值會被修改為20000並且生效。
複製程式碼

這篇文章主要是記錄第二個面試,順便回憶一下Integer和int的區別。

相關文章