为何不要使用==比较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。ide

解决方法

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

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

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

相关文章
相关标签/搜索