題外話
首先是Java在1.5後引入了自動拆裝箱
public static void main(String[]args){
Integer intg=1; //裝箱
int i=intg; //拆箱
}
實際上那:
自動裝箱都是通過包裝類的valueOf()方法來實現的.自動拆箱都是通過包裝類對象的xxxValue()來實現的。
Integer intg=Intg.valueOf(1);
int i=intg.intValue();
正題:
public static void main(String[]) aa {
Integer integer1 = 127;
Integer integer2 = 127;
if (integer1 == integer2)
System.out.println("integer1 == integer2");
else
System.out.println("integer1 != integer2");
Integer integer3 = 128;
Integer integer4 = 128;
if (integer3 == integer4)
System.out.println("integer3 == integer4");
else
System.out.println("integer3 != integer4");
}
輸出: integer1 == integer2
integer3 != integer4
爲什麼這樣呢
自動拆裝箱機制提供了一個緩存機制來節省內存和提高性能,Integer對象通過使用相同的對象引用來比較大小,而這個相同的對象就是緩存;即:
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);
}
自動裝箱時,如果數字在-128至127之間時,會直接使用緩存中的對象,而不是重新創建一個對象,否則會重新創建對象,
所以之所以Integer對象可以比較值大小,也是比的對象;
但是在比較兩個對象相等時,在上面的範圍內可以“==”,超過就得老老實實“equals”