在项目开发中,遇到了这个问题,两个ID(菜单ID)为Integer的值的比较,ID是主键自增的,前期数据量小(考虑到菜单列表不会增加到超过127个),未出现bug。
后面项目越做越大,菜单ID增加到128时,出现了bug,断点查询得知,Integer类型的比较在值为128时,结果为false。
其原因如下:
Integer类内部 通过静态内部类提供了一个缓存池,范围在-128~127之间,如果超过这个范围 Integer 值都是new出来的对象,==比较的话肯定会出错!
查看Integer类的源码:
public static Integer valueOf(int paramInt) { assert (IntegerCache.high >= 127); if ((paramInt >= -128) && (paramInt <= IntegerCache.high)) return IntegerCache.cache[(paramInt + 128)]; return new Integer(paramInt); }
得知解决办法如下:
此处需使用equals比较,或者使用a.intValue() == b.intValue()。