java中Long,Interger等引用类型的大小比较问题

一枚java小白在上路阶段遇到这样一个问题(大佬可以直接点右上角的小叉叉),简单描述如下:
在这里插入图片描述
注释即为输出结果,对小白来说很奇怪,这也就是为什么有时对大写字母开头的类型直接 == 比较时,结果忽对忽错。
在回答上面问题之前,我首先批判一下自己,什么大写字母开头的类型,啊呸,这个叫原始类型的封装类,好不?java对每个原始类型都提供了封装类(大写开头),封装类与原始类型有很多不同,blablablabla…网上一大堆解释。
好了,废话不多说,我们来看问题,要解决这个问题,我们追根溯源来看源码(以Long为例,其它都差不多)。
在这里插入图片描述
通过源码我们可以看出,对于-128到127的每一个数字都提前做了缓存,当我们比较两个Long类型数据是就是比较两个对象的引用,而当数据大小位于该区间时,返回的引用类型便是已经存在cache的引用,也就是说相同的数字1,a和b实则为同一个对象的引用,所以当然相等啦。然后,当数据大小超出范围时,就会重新new一个新的对象,虽然都是128,但c和d是不同对象的引用,所以不相等啦。
我知道当大佬们看到这里时,内心肯定在说我low了,555555555… 实际上对于这种原始类型的封装类进行大小比较时,没人会直接拿 == 来比较,正确的方式时使用equals()方法来比较,该方式会将Long对象数据转换成long类型,然后在用 == 比较,源码如下:
在这里插入图片描述
总结一下,对于原始类型的封装类直接使用 == 来比较大小时,都有一个范围,但是超出这个范围便不能直接使用==,但是(重要的事情都是但是),对这种类型数据进行大小比较时,强烈建议用equals()方法。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值