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

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