先来看三个判断:
package com.javaexe;
public class AboutValueOf {
public static void main(String[] args) {
Integer n = new Integer(1);
Integer m = new Integer(1);
System.out.println(n == m);
Integer n1 = Integer.valueOf(1);
Integer m1 = Integer.valueOf(1);
System.out.println(n1 == m1);
Integer n2 = 128;
Integer m2 = 128;
System.out.println(n2 == m2);
}
}
问:这三个判断分别会输出什么? 答案是false、true、false。
第一个很好理解,new Integer()返回的直接是一个Integer的对象实例。 用==来比较两个对象时,比较的是地址,n和m两个对象的地址是不同的,所以返回false。
重点是第二个和第三个为什么一个返回true,一个返回false?
首先第三个是自动装箱,它的本质其实就是Integer.valueOf(),所以本质和第二个是一样的。
这时候就需要看到Integer包装类的valueOf()方法了。
从上面valueOf()方法的源码中,我们可以看出,其实它返回的不一定是对象。 如果满足if条件,也就是大于等于IntegerCache.low并且小于等于IntegerCache.high,那么返回的就是IntegerCache数组中的数值i,否则才会去new一个Integer的对象来返回。
同样从源码中看到IntegerCache.low和IntegerCache.high的值分为是-128和127。
到这就明白了为什么第二个是true,而第三个返回的是false了。原因就是第二个的值为1,符合if的条件,返回的是IntegerCache数组中的值,并不是对象,这时候==判断的是值,值相等,返回true。而第三个128,不符合if的条件,返回的是new出来的Integer对象,所以==依旧判断的是地址,返回false。