开发过程中大家可能会遇到integer类比较的问题,虽然看上去值一样但是比较的结果就是不相同。
public static void main(String[] args) {
Integer num1 = 1111;
Integer num2 = 1111;
System.out.println(num1 == num2); // false
System.out.println(num1.equals(num2)); // true
Integer num3 = 11;
Integer num4 = 11;
System.out.println(num3 == num4); // true
System.out.println(num3.equals(num4)); // true
}
上面的代码因为==比较的是地址,而Integer类equals比较的是值。所以第一组比较的结构:==比较结果是false,而equals比较的true。这也是为什么平时开发过程中尽量要多用equals的原因,如果仅是==比较这样会遇到这种误区,我们这些菜鸟就会说了“明明一样的值怎么回事啊。”,这种代码盲区不易察觉。那么到底是怎么回事呢?我们还是看看Integer代码的源码就会明白很多。
// Integer源码
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
那么上面的就是比较重点的源码了。IntegerCache.low的值为-128,IntegerCache.high是127,IntegerCache.cache是一个常量数组,这三个就组成了这么个逻辑,数字为-128和127之间的值就要放在常量区,而不在此范围内的值要new一个新的地址给对象。这样就会造成-128~127之间的数值的地址会相同,而超出这个范围的话都会是新的地址。这也说明了为什么同是1111的两个变量在进行==比较时会出现false了。而11的两个变量在进行==比较时确实true。那么equals就不说了,因为是纯数值的比较当然会是true。