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

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

你可能感兴趣的:(java基础,Long大小比较)