码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-08-28 01:24:24      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:解决   ret   一个   sid   eof   源码   ons   require   ati   

比较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?

标签:解决   ret   一个   sid   eof   源码   ons   require   ati   

原文地址:https://www.cnblogs.com/expiator/p/11421462.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!