JAVA關於Integer使用==的問題

今天突然發現一個特別有意思的事,就是使用java的Integer的比較出現一個問題,就是使用 ==(引用的比較),並沒有獲取到我們想要的結果

一、== 和 equals的區別

我們知道Java有兩種類,一種是原始類,例如int,long等,還有包裝類Integer,Long等,在比較原始類時我們使用 == 來比較,比較的是值,比較包裝類時使用 equals 來比較值,用 == 比較引用,這些我們都是知道的,但是今天發現的有點顛覆我的三觀。

二、== 的比較

例子如下

    public static void main(String... strings) {

        Integer integer1 = Integer.valueOf(3);
        Integer integer2 = Integer.valueOf(3);

        if (integer1 == integer2) {
            System.out.println("integer1 == integer2");
        } else {
            System.out.println("integer1 != integer2");
        }

        Integer integer3 = Integer.valueOf(500);
        Integer integer4 = Integer.valueOf(500);

        if (integer3 == integer4) {
            System.out.println("integer3 == integer4");
        } else {
            System.out.println("integer3 != integer4");
        }
    }

比較的結果:

integer1 == integer2
integer3 != integer4

結果並不是我認爲的都是false
是發生了bug了嗎,我去看了源碼

    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

從這裏我們可以看出值的取值方式是從緩存裏取得,默認區間是-128到127.從這裏可以看出值是從緩存的列表裏去,值相同時引用也是一樣,當超出這個範圍時纔會創建新對象。

所以這裏的坑需要記住。
參考文檔 :http://www.codeceo.com/article/java-integer-cache.html

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