題目如下:
>看代碼寫運行結果
public class IntegerAndInt
{
public static void main(String[] args)
{
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2);
System.out.println(i3==i4);
}
}
運行結果是什麼呢?(可以事先思考一下再看答案)
-thingking!!-thingking!!-thingking!!-thingking!!-thingking!!-thingking!!-thingking!!-thingking!!-thingking!!-thingking!!-thingking!!-thingking!!-thingking!!-thingking!!-thingking!!-thingking!!
運行結果揭曉:
true
false
-------------------不相信?不信可以自己試一試
coding.......
-------------------Oh My God! but why?
涉及到Java中Integer與int之間的自動拆裝箱知識點
自動拆裝箱指的是:8種基本類型與其對應包裝器類型可以直接互換
注意:基本類型的數組,與其包裝器類型的數組不可互換
自動拆裝箱由編譯器(不是虛擬機)完成的,編譯器幫我們完成拆箱和裝箱操作
Add:可以用反編譯看看編譯器到底爲我們做了什麼
1.裝箱:把int類型賦值給Integer類型時(Integer = int),int類型的變量的值會自動裝箱成Integer類型,然後賦給Integer類型的引用,這裏底層就是通過調用valueOf()這個方法來實現的。
2.拆箱:把Integer類型賦值給int類型時(int = Integer),Integer類型的變量的值會自動拆箱成int類型,然後賦給int類型的變量,這裏底層則是通過調用intValue()方法來實現的。
下面給出Integer的valueOf函數源代碼:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
IntegerCache是Integer的靜態內部類cache是IntegerCathed的成員: static final Integer cache[];(注意關鍵字 static final Integer)
caChe裏面裝的值是【-128,127】之間的Integer,這裏我截取一部分來自IntegerCache的靜態代碼塊的代碼以便更清楚的認識:
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
說明:high的值是127,low的值是-128 (兩個都是IntegerCache的成員變量,都是static final int類型)
這樣一來,就相當於-128到127之間的Integer已經存在了。後面不論你有多少個Integer = int類型的裝箱操作,如果int的值始終在-128到127之間,那麼得到的Integer對象始終是指向事先就已經確定好的這些區域。其中如果有些int的值相等,那麼這些int所對應的Integer對象就指向同一塊區域,這也就是爲什麼上面的“i1==i2"得到的是true的緣故了。至於"i1==i2"爲什麼是false,相信大家都知道:由於【+128,127】滿足不了所有的需求,必須重新開闢了一塊內存空間用於存放“越界”的Integer。因爲200不在【-128,127】內,而兩次開闢的內存空間位置不同,所以"i1==i2"是false。
<Integer及其內部類IntegerCache具體內容請參看源碼>
【注:*Java設計模式之享元模式的體現】