Java 巨坑篇之无底深坑Long类型

背景:

因为公司使用的spring jpa 一般表的主键都是Long类型,突然有一次程序好好的跑着啥呀没有改突然死活不进入那个if(entity.id==otherEntity.id) 我开始怀疑人生,开始怀疑Java,开始怀疑Windows是不是系统原因,我甚至开始怀疑是不是硬件原因。



最后找不出问题的我,只能求助baidu.com,google.com,但却不知道搜什么,就输入了一个:Long ==Long

居然一篇篇看下来,发现了点什么,佩服我的机智。

可能还是应了那句古话,帅人有帅报~!

前言:

long数据类型是64位有符号的Java原始数据类型。当对整数的计算结果可能超出int数据类型的范围时使用。

long数据类型范围是-9,223,372,036,854,775,808至9,223,372,036,854,775,807(-2^63至2^63-1)。

long数据类型范围内的所有整数称为long类型的整数字面量。long类型的整数常数总是以大写L或小写l结尾。

问题:

if( Long == Long )不匹配?

原因:

其实,通过源码分析:

1 2 3 4 5 6 7 public static Long valueOf(long l) { final int offset = 128; if (l >= -128 && l <= 127) { // will cache return LongCache.cache[(int)l + offset]; } return new Long(l); } 在128~127这些数的对象在内存中被缓存起来,在内存中提供重用,这些数获取的时候就会自动获取缓存中的数,而不是new出来的对象。

所以,这与自动打包拆包无关。

再所以…,判读Long对象是否相等的时候建议不要采用 == 的形式,程序中无法绝对的判断参数值是否会在这个区间内,如果不在,那就出现让你摸不着头脑的问题。

解决方案:

entity.getId().longValue()==otherEntity.getId().longValue 完美解决!

最后加上高质量的淘宝店:如有质量问题随时滴滴我,童叟无欺!

【童装园服定制店铺】 点击链接,再选择浏览器咑閞;或復·制这段描述¥zfwjY4JVngW¥后到淘♂寳♀

经验分享 程序员 微信小程序 职场和发展