請先看一段代碼
//代碼段1
        Integer i1=200;
        Integer j1
=200;
        System.out.println(i1
==j1);

//代碼段2

        Integer i2
=100;
        Integer j2
=100;
        System.out.println(i2
==j2);
這兩段代碼的結果分別是多少?
JDK1.6上執(zhí)行代碼段1的結果為false,代碼段2的結果為true.
實驗1:在JDK1.4下代碼段1不能編譯通過的,會提示:“ Type mismatch: cannot convert from int to Integer”的錯誤,改寫為:“Integer i1 = new Integer(200); Integer j1 = new Integer(200);”,編譯正常。
兩段代碼運行結果為false,true,代碼段1由于是對象使用==比較,比較的是兩個對象的地址,所以為false(這個大家都應該明白了)。

實驗2: 在JDK1.5下代碼段1可以編譯通過,因為其實現(xiàn)了自動裝箱(Autoboxing)和自動拆箱(Auto-Unboxing)。
兩段代碼運行結果為false,true

從實驗2就可以看出,問題出在了裝箱/拆箱過程,通過反編譯,找出Integer賦值調用的是Integer.valueOf方法,查JDK源代碼,如下所示:
public static Integer valueOf(int i) {
        if(i >= -128 && i <= IntegerCache.high)
            return IntegerCache.cache[i + 128];
        else
            return new Integer(i);
    }
看到這里,我想大家都應該明白為什么會是false了。原來在裝箱時,將-128<=i1<=127范圍之內的數(shù)據(jù)打包成緩存里的Integer對象了,由于不用new,所以這個區(qū)間里的值用直接=賦值方法得到的變量地址就是同一個,而超出這個范圍的數(shù)值就會new一個Integer對象出來,用==運行符來計算,怎么也不可能為true。