一、问题描述
在一次对树形结构的数据遍历中,出现了树形变乱的问题,在此遍历的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,所有包装类都适用。
有些问题虽然不大,但是却是值得我们去深思的 。 加油。 :)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。