一、问题描述

在一次对树形结构的数据遍历中,出现了树形变乱的问题,在此遍历的ID采用Long类型,在数值比较中达到某个界定值后,树形结构变形。

图片描述

二、调试过程

经过debug后发现,在Long类型数值比较中使用的是 “==” ,咋看之下没啥问题,其实是有问题的!在这里Long为包装类,是一个对象。
在这里回顾一下基本的知识吧:
判断两个对象是否为同一对象,是通过内存中地址是否一致为判定的,使用 == 或.equals(obj)即可进行判定。
那么为什么一些数值比如1、2、3、4之类的Long对象使用==可以正确判断呢?

三、进入Long里面查看

图片描述
在这里我们可以看到Long类型的数值从-128~127 在一开始已经放进去了静态代码块里面的cache数组里面,
而基本包装类型在自动装箱成包装类型的时候会从缓存里面取:

图片描述

可以看到在数字大于-128 或 小于127的时候,是直接从cache里面取出来的,所以在这个数值范围内的Long类型对象是可以直接进行比较的,但是超出了这个范围,就会new 新的Long类型,这就导致使用 == 判断不正确,也就是树形结构在id超出127后就发生了变化。使用包装类重写过的equals方法就可以正确对包装类型的数值正确进行判断了。

四、后续结语

后来在查看《阿里巴巴java开发规范》时候也看到了:

图片描述

这些不止是适用于Integer或是Long,所有包装类都适用。

有些问题虽然不大,但是却是值得我们去深思的 。 加油。 :)


小哥
12 声望2 粉丝

虚心学习