之前没注意过Integer类型比较数值大小,一直在用 ==
某天,写的一段程序没跑通,才注意到这个问题
举个例子
public static void main(String[] args) {
Integer a = 1 ;
Integer b = 1 ;
System.out.println(a == b);
System.out.println(a.equals(b));
a = 1515;
b = 1515;
System.out.println(a == b);
System.out.println(a.equals(b));
}
结果: true true false true
原因
- Integer.valueOf()
上述Integer类型在比较大小的时候调用了Integer.valueOf()方法,源码:
/** * 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) { assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
-128到127之间的数,比较数值大小的时候用equals.() 和 == 得到的结果是一样的,超出了这个范围,用 == 比较大小就相当于判断是否是同一个对象了。