public classCompare {
public static voidmain(String[] args) {
Integer a1 = 110;
Integer a2 = 110;
Integer a3 = 160;
Integer a4 = 160;
System. out.println( a1 == a2);//true
System. out.println( a3 == a4);//false
}
}
当我们给Integer 赋值int类型的时候会自动装箱成了Integer,执行了
Integer a1 = Integer.valueOf(110);
Integer a2= Integer.valueOf(110);
Integer a3= Integer.valueOf(160);
Integer a4= Integer.valueOf(160);
那么我们思考一下为什么执行==会一个返回true、一个返回false呢,我们来看看Integer.valueOf(110)的源码
public staticInteger valueOf(inti) {
if(i >= IntegerCache.low&& i <= IntegerCache.high)
returnIntegerCache.cache[i + (-IntegerCache.low)];
return newInteger(i);
}
首先我们来看看low、和high的值,初始为-128、127
从上面我们可以知道给Interger 赋予的int数值在-128 - 127的时候,直接从cache中取出引用,这些cache引用对Integer对象地址是不变的,但是不在这个范围内的数字,则new Integer(i) 这个地址是新的地址,所以就不一样了。
public classCompare {
public static voidmain(String[] args) {
Integer a1 = 110;
Integer a2 = 110;
Integer a3 = 160;
Integer a4 = 160;
System. out.println( a1 == a2);//true
System. out.println( a3 == a4);//false
Integer a5=10;
Integer a6=newInteger(10);
Integer a7=127;
Integer a8=127;
System.out.println(a5==a6);//false
System.out.println(a7==a8);//true
}
}
代码解读:因为 a7 和 a8在-128-127这个范围内指向的是同一个引用,所以==也是true,而new Integer()方法则重写开辟了内存空间,所以==结果为false
基本类型:比较的是值是否相同。
引用类型:比较的是引用是否相同。