封装类型变量比较问题

现象:

code review中发现有代码中用下面的方式比较Integer变量:

if (object.getA() == xxx) {
    ...
}

 

这种方式是有风险的,当整型数据的值超出-128-127的范围时,两个值相同的Integer变量用==比较会返回false。

来看看测试结果:

image2018-11-9_16-22-55.png?version=1&modificationDate=1541751776000&api=v2uploading.4e448015.gif转存失败重新上传取消

原因分析:

在Integer类中有一个IntegerCache类,来看看这个类的说明:

image2018-11-9_16-26-30.png?version=1&modificationDate=1541751991000&api=v2uploading.4e448015.gif转存失败重新上传取消

IntegerCache中定义了一个Integer数组,初始化-128到127之间的整型对象,也就是说,用Integer i1 = 127, i2 = 127;的方式定义两个对象i1和i2,实际上都会从这个cache中取到

同一个对象,"i1 == i2"比较i1和i2的内存地址,实际上是同一个对象,所以地址也相同,"i1 == i2"返回true,而i3和i4由于超出了127,所以重新生成两个对象,内存地址不一样,

"i3 == i4"返回false。

从上面jdk的注释中我们还看到,这个cache的上限是可以由参数-XX:AutoBoxCacheMax来设置的,我们来试试。

上面的代码再增加两个变量,以作对比,先运行一次:

 

可以看到,后面两个比较都返回false,因为都超出了127.

现在我们来把cache的上限设置为200试试:

image2018-11-9_16-35-26.png?version=1&modificationDate=1541752527000&api=v2uploading.4e448015.gif转存失败重新上传取消

运行结果:

image2018-11-9_16-35-47.png?version=1&modificationDate=1541752548000&api=v2uploading.4e448015.gif转存失败重新上传取消

此时,i3 == i4返回了true。

实际上,Double, Boolean这些类同样都有一个缓存,有兴趣的可以进入这些类的源码看看。

 

解决方案:

用Integer对象的equals方法来比较,或者用i1.intValue() == i2.intValue()来比较即可,此时请注意对null的判断。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值