簡介: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的區別。