【轉載】Long類型的“==”比較,踩坑

當兩個對象進行比較的時候,我們應該使用equals方法,但是由於基礎類型在1.5以前的jdk,大家已經習慣了 == 的方式,所以有時候,會馬虎大意依然使用 ==  進行比較,那麼這樣會有什麼問題嗎?結果是什麼?

1

2

3

4

5

6

7

8

9

10

11

Long a2 = 127L;

Long b2 = 127L;

System.out.println(a2 == b2);

 

結果是true,竟然是true???

 

Long a3 = 128L;

Long b3 = 128L;

System.out.println(a3==b3);

 

結果是false

這樣結果的原因是Long類型內部有一個內部類,維護了一個cache,

見Long源碼 552行

 

1

2

3

4

5

6

7

public static Long valueOf(long l) {

    final int offset = 128;

    if (l >= -128 && l <= 127) { // will cache

        return LongCache.cache[(int)l + offset];

    }

        return new Long(l);

}

見Long源碼 528行

 

1

2

3

4

5

6

7

8

9

10

private static class LongCache {

    private LongCache(){}

 

    static final Long cache[] = new Long[-(-128) + 127 1];

 

    static {

        for(int i = 0; i < cache.length; i++)

        cache[i] = new Long(i - 128);

    }

    }

-128到127直接的值都放在cache裏,不會創建新的對象,所以==比較的時候,結果是正確的,

當超過這個範圍,因爲是創建的新對象,所以自然不會相等

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