爲何不要使用==比較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

相關文章
相關標籤/搜索