Java自動裝箱的陷阱

今天看《深入理解Java虛擬機》,其中作者留了一段代碼,讓讀者自己試試,運行結(jié)果和我預(yù)想的完全不一致,因此記錄下來,做個總結(jié)。

Integer a = 1;
        Integer b = 2;
        Integer c = 3;
        Integer d = 3;
        Integer e = 321;
        Integer f = 321;
        Long g = 3L;
        System.out.println("c == d :"+(c == d));
        System.out.println("e == f :"+(e == f));
        System.out.println("c == (a + b) :"+(c == (a + b)));
        System.out.println("c.equals(a + b) :"+c.equals(a + b));
        System.out.println("g == (a + b) :"+(g == (a + b)));
        System.out.println("g.equals(a + b) :"+g.equals(a + b));

以上代碼輸出結(jié)果如下:

c == d :true
e == f :false
c == (a + b) :true
c.equals(a + b) :true
g == (a + b) :true
g.equals(a + b) :false

這里有兩個疑惑:

為什么 c == d 但是 e != f?

這其中有兩個原因,一是Integer賦值過程自動裝箱;二是-128~127范圍內(nèi)的Integer的cache。

  • 自動裝箱
 Integer c = 3

編譯后結(jié)果如下:

 Integer c = Integer.valueOf(3);
  • -128~127范圍內(nèi)的Integer的cache
    -128~127范圍內(nèi)的數(shù)據(jù)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);
    }
private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];
}

基于以上兩條,才會出現(xiàn)c == d 但是 e != f這種情況

為什么 g == (a + b) 但是g.equals(a + b) == false ?

這是因為,編譯期間遇到算術(shù)運算符會自動拆箱(??==運算在不遇到算術(shù)運算符的情況下不會自動拆箱):

System.out.println("g == (a + b) :"+(g == (a + b)));

編譯結(jié)果如下:

 System.out.println("g == (a + b) :"+(g.intValue() == (a.intValue() + b.intValue()));

因此,才會出現(xiàn)g == (a + b)
至于g.equals(a + b) == false,完全是由于對象類型不一致(Long和Integer)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,633評論 18 399
  • Java8張圖 11、字符串不變性 12、equals()方法、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,887評論 0 11
  • 集合框架: 1)特點:存儲對象;長度可變;存儲對象的類型可不同2)Collection(1)List:有序的;元素...
    Demo_Yang閱讀 1,385評論 0 4
  • 下面的內(nèi)容是對網(wǎng)上原有的Java面試題集及答案進行了全面修訂之后給出的負責(zé)任的題目和答案,原來的題目中有很多重復(fù)題...
    獨念白閱讀 1,490評論 0 3
  • walk漫閱讀 218評論 0 0

友情鏈接更多精彩內(nèi)容