在一次对树形结构的数据遍历中,出现了树形变乱的问题,在此遍历的ID采用Long类型,在数值比较中达到某个界定值后,树形结构变形。java
通过debug后发现,在Long类型数值比较中使用的是 “==” ,咋看之下没啥问题,实际上是有问题的!在这里Long为包装类,是一个对象。
在这里回顾一下基本的知识吧:
判断两个对象是否为同一对象,是经过内存中地址是否一致为断定的,使用 == 或.equals(obj)便可进行断定。
那么为何一些数值好比一、二、三、4之类的Long对象使用==能够正确判断呢?数组
在这里咱们能够看到Long类型的数值从-128~127 在一开始已经放进去了静态代码块里面的cache数组里面,
而基本包装类型在自动装箱成包装类型的时候会从缓存里面取:缓存
能够看到在数字大于-128 或 小于127的时候,是直接从cache里面取出来的,因此在这个数值范围内的Long类型对象是能够直接进行比较的,可是超出了这个范围,就会new 新的Long类型,这就致使使用 == 判断不正确,也就是树形结构在id超出127后就发生了变化。使用包装类重写过的equals方法就能够正确对包装类型的数值正确进行判断了。spa
后来在查看《阿里巴巴java开发规范》时候也看到了:debug
这些不止是适用于Integer或是Long,全部包装类都适用。调试
有些问题虽然不大,可是倒是值得咱们去深思的 。 加油。 :)对象