Java中Integer类比较问题解析

开发过程中大家可能会遇到integer类比较的问题,虽然看上去值一样但是比较的结果就是不相同。

public static void main(String[] args) {
        Integer num1 = 1111;
        Integer num2 = 1111;
        System.out.println(num1 == num2);       // false
        System.out.println(num1.equals(num2));  // true
        Integer num3 = 11;
        Integer num4 = 11;
        System.out.println(num3 == num4);       // true
        System.out.println(num3.equals(num4));  // true
    }

上面的代码因为==比较的是地址,而Integer类equals比较的是值。所以第一组比较的结构:==比较结果是false,而equals比较的true。这也是为什么平时开发过程中尽量要多用equals的原因,如果仅是==比较这样会遇到这种误区,我们这些菜鸟就会说了“明明一样的值怎么回事啊。”,这种代码盲区不易察觉。那么到底是怎么回事呢?我们还是看看Integer代码的源码就会明白很多。

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

那么上面的就是比较重点的源码了。IntegerCache.low的值为-128,IntegerCache.high是127,IntegerCache.cache是一个常量数组,这三个就组成了这么个逻辑,数字为-128和127之间的值就要放在常量区,而不在此范围内的值要new一个新的地址给对象。这样就会造成-128~127之间的数值的地址会相同,而超出这个范围的话都会是新的地址。这也说明了为什么同是1111的两个变量在进行==比较时会出现false了。而11的两个变量在进行==比较时确实true。那么equals就不说了,因为是纯数值的比较当然会是true。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值