目录
1.Integer常量池:
在Integer类中,如果创建的对象的值-128 <= x <= 127,那么就会返回指向 IntegerCache.cache 中已经存在的对象的引用,否则就会重新创建一个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.low就是127
那么以下代码的输出结果就很好理解了:
Integer a = 100;
Integer b = 100;
System.out.println(a == b);//true
即使a和b都是引用变量,但由于a和b的值在-128与127之间,那么它们返回的对象就会是常量池里已经存在的对象引用,所以这两个返回的引用对象是同一个(常量池里的100)。
但是如果超出了这个常量池的范围,那么不相等了:
Integer a = 128;
Integer b = 128;
System.out.println(a == b);//false
2.一些特殊情况下的比较:
1.一个new出来的对象和一个常量池里的对象相比,由于new出来的对象的引用指向堆中的新建的对象,而不是new出来的对象指向常量池里的对象,所以它们并不相同。
Integer a = new Integer(100);
Integer b = 100;
System.out.println(a == b);//false
就算它们的值都超过了常量池的值的范围,那么也不会相同:
Integer a = new Integer(1001);
Integer b = 1001;
System.out.println(a == b);//false
2.两个new出来的对象相比,由于a和b都创建了一个新的引用对象,那么用这两个对象的引用进行比较自然是不相等的(即使它们的值是在常量池范围内的)。
Integer a = new Integer(100);
Integer b = new Integer(100);
System.out.println(a == b);//false
3.Integer类和int值相比较,因为包装类Integer和基本数据类型int比较时,Java会自动拆箱为int,然后进行比较,实际上就变为两个int变量的比较。
Integer a = new Integer(100);
int b = 100;
System.out.println(a == b);//true
3.拆箱与装箱
装箱就是将基本数据类型转化为包装类型,那么拆箱就是将包装类型转化为基本数据类型。
以Integer和int为例:
将int类转化为Integer就称为装箱:
Integer a = 128;
int b;
b = a;
将Integer类转化为int就称为拆箱:
Integer a;
int b = 128;
a = b;