從一個“變態”的題看“分析Java源代碼”的重要性!

題目如下:

>看代碼寫運行結果

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的值是127low的值是-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設計模式之享元模式的體現】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章