关于Integer类型的比较,在Integer值大于127时,为何使用==结果为false

在项目开发中,遇到了这个问题,两个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()。

原文地址:https://www.cnblogs.com/gonglihao/p/13100392.html