1.我们都知道基本类型(int,long邓)通过==比较的是他们的值大小,而引用类型比较的是他们的引用地址
2.当我们给一个Integer赋予一个int类型的时候会调用Integer的静态方法valueOf()方法也就是自动装箱
直接上代码:
public class TestEquals {
public static void main(String[] args) {
int int1 = 12;
Integer i1 = new Integer(12);
Integer i2 = new Integer(12);
Integer i3 = new Integer(127);
Integer a1 = 127;//相当于 Integer.valueOf(127);
Integer a2 = 127;
Integer y = 128;
Integer z = 128;
/**
* true
* Integer是int的封装类,当Integer与int进行==比较时,Integer就会拆箱成一个int类型。
* 所以还是相当于两个int类型进行比较,这里的Integer,不管是直接赋值,还是new创建的对象,只要跟int比较就会拆箱为int类型,所以就是相等的。
*/
System.out.println("int1 == i1 -> " + (int1 == i1));
/**
* false
* 这是两个都是对象类型,而且不会进行拆箱比较,所以不等
*/
System.out.println("i1 == i2 -> " + (i1 == i2));
/**
* false
* 这个比较好理解
* i3是新创建的对象,而a1=127会自动装箱调用Integer.valueOf方法返回Integer对象,这个是IntegerCache.cache返回的缓存Integer对象,所以两个对象不相等。
*
*/
System.out.println("i3 == a1 -> " + (i3 == a1));
/**
* true
* 很好理解,都是127 自动装箱,返回的是同一个对象
*/
System.out.println("a1 == a2 -> " + (a1 == a2));
/**
* false
* 都是128,超过了IntegerCache.high=127,所以返回的都是新创建的Integer对象
*/
System.out.println("y == z -> " + (y == z));
}
}
当我们给一个Integer赋予一个int类型的时候会调用Integer的静态方法valueOf。
源码:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
这里面可以看到,当传递的i的大小在IntegerCache.low~IntegerCache.high之间的时候,是返回的缓存里面的数据。超出范围就是直接创建的一个新的Integer对象。
Integer.java
由图可知,在Integer类加载的时候会初始化IntegerCache类,从而初始化里面的static {}块,从而初始化IntegerCache.cache[]变量(-128~127)。
总结:int在进行自动装箱的时候,调用了Integer.valueOf方法,当i在-128~127范围内是从IntegerCache中直接获取,当超越这个范围才会new 一个新的Integer对象返回。