Java中关于包装类型容易入坑的一个点

发布时间:2019-11-17 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Java中关于包装类型容易入坑的一个点脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

一、问题描述

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

图片描述

二、调试过程

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

三、进入Long里面查看

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

Java中关于包装类型容易入坑的一个点

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

四、后续结语

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

Java中关于包装类型容易入坑的一个点

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

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

脚本宝典总结

以上是脚本宝典为你收集整理的Java中关于包装类型容易入坑的一个点全部内容,希望文章能够帮你解决Java中关于包装类型容易入坑的一个点所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。