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¥后到淘♂寳♀