共计 604 个字符,预计需要花费 2 分钟才能阅读完成。
一、问题描述
在一次对树形结构的数据遍历中,出现了树形变乱的问题,在此遍历的 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,所有包装类都适用。
有些问题虽然不大,但是却是值得我们去深思的。加油。:)
正文完
发表至: java
2018-12-23