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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值