IntegerJDK5.0新特性有趣現象
在JDK5.0中,爲了簡化書寫,出現了自動裝箱和拆箱機制。
原來的寫法:
Integer i = new Integer(5);
新的寫法:
Integer i = 5;//自動裝箱,內部運行時,通過Integer.valueOf(5);方法將5封裝成Integer對象。
i + 3; i是一個對象,無法直接和5進行加法運算,必須先轉成基本數據類型,通過調用i對象的intValue()方法。
有趣的現象:
Integer i1 = 5;
Integer i2 = 5;
System.out.println(i1==i2);//true 爲什麼呢?
當給i1,i2重新賦值,
Integer i1 = 500;
Integer i2 = 500;
System.out.println(i1==i2);//false?
這時最好去查看裝箱的原理Integer.valueOf()方法是怎麼實現。
valueOf源碼:
public static Integer valueOf(int i){
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
IntegerCache是Integer中的一個內部類。
IntegerCache.high的值就是127.
通過源碼不難看出,IntegerCache將-128~127之間的數值對象進行了緩存。
如果裝箱的數值在該範圍內,它並不創建一個新對象,而是返回一個緩存中已有對象。
所以值爲5時,正好在該範圍內,i1和i2引用的是同一個對象。
值爲500時,在該範圍以外,i1和i2引用的是不同對象。
歐了。