为什么不要使用==比较Integer?

Posted expiator

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么不要使用==比较Integer?相关的知识,希望对你有一定的参考价值。

比较Integer的时候,不要用==。
查看Integer的源码,如下:

    /**
     * Returns an @code Integer instance representing the specified
     * @code int value.  If a new @code Integer instance is not
     * required, this method should generally be used in preference to
     * the constructor @link #Integer(int), as this method is likely
     * to yield significantly better space and time performance by
     * caching frequently requested values.
     *
     * This method will always cache values in the range -128 to 127,
     * inclusive, and may cache other values outside of this range.
     *
     * @param  i an @code int value.
     * @return an @code Integer instance representing @code i.
     * @since  1.5
     */
    public static Integer valueOf(int i) 
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    

通过注释可以知道,为了更好的空间和时间性能,Integer会缓存频繁使用的数值,数值范围为-127到128,在此范围内直接返回缓存值。
IntegerCache.low 是-127,Integer.high是128,如果在这个区间内,他就会把变量i当做一个变量,放到内存中;
但如果不在这个范围内,就会去new一个Integer对象,
而如果两个Integer值都不在这个范围内,那么就会new了两个对象实例,两个对象用==比较肯定是false。

解决方法

比较Integer的值有两种方法,
1.一个是用equals()比较,但是注意要判空,避免空指针异常。
2.一个是用intValue()转成int比较。
示例如下:

        Integer value1=129;
        Integer value2=129;
        if(value1.intValue()==value2.intValue())
            // ...
        

参考资料:
https://blog.csdn.net/luohao_/article/details/86607686

以上是关于为什么不要使用==比较Integer?的主要内容,如果未能解决你的问题,请参考以下文章

[Java]_[初级]_[装箱和拆箱的陷阱-不要使用==进行包裹类型wrapper class比较]

Java Integer compareTo() - 为啥使用比较与减法?

int和Integer有什么区别

为啥 (Integer) 222 != (Integer) 222 在 Java 中? [复制]

为什么Integer用==比较时127相等而128不相等?

int与Integer的爱恨情仇