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