示例代碼:
class BoxIntInteger {
public static void main(String[] args) {
Integer a = new Integer(10111);
int b = 10111;
boolean equal1 = a == b;
boolean equal2 = a.equals(b);
System.out.println(equal1);
System.out.println(equal2);
}
}
反編譯字節碼:
public static void main(String args[])
{
Integer a = new Integer(10111);
int b = 10111;
boolean equal1 = a.intValue() == b;
boolean equal2 = a.equals(Integer.valueOf(b));
System.out.println(equal1);
System.out.println(equal2);
}
1:可以看出對於Integer與int使用==比較大小的話,優先Integer拆箱。
2: 如果使用equals比較大小的話,則int裝箱。
提示:對於Integer與int之間大小比較優先使用equals比較,否則容易出現空指針,例如:
Integer c= null;
System.out.println(c==1);
原因:由於Integer需要調用intValue進行拆箱,因而空指針。
Integer與Integer必須使用equals方法比較,這個就不必解釋了。但是通常我們可以看先Integer與Integer之間使用==也可以正確比較,原因是:Integer對於-128到127之間的數字在緩存中拿,不是創建新對象。
緩存獲取數據源碼:java.lang.Integer#valueOf(int)
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
更多關於緩存細節參考:java.lang.Integer.IntegerCache
