首先我们来看一道面试题
Integer a = Integer.valueOf(1);
Integer b = Integer.valueOf(1);
Integer c = Integer.valueOf(128);
Integer d = Integer.valueOf(128);
System.out.println(a==b);
System.out.println(c==d);
此处给予思考时间,我们带着问题先来看看Integer的IntegerCache缓存。
IntegerCache
- IntegerCache是Integer类中的一个私有静态内部类
- 如图,其有一个属性是一个数组cache[],通过源码可以知道其最小值为low设定好的-128,而最大值在默认情况下则是high默认的127
- 通过源码可以知道cache[]数组里预先存放有-128到127的整型数值
- 当我们使用Integer.valueOf(int)方法时,有以下两种情况
-
1.当int∈[-128,127],此时会直接从cache数组中取出该值
-
2.当int∉[-128,127],此时会new一个Integer对象
-
回看题目
- 可以知道
- 当为1时,a,b实际上指向的是cache[]中的同一个1,两个引用指向同一个数
- 而当为128时,超过了cache[]的存储值得范围,重新new了一个实例对象,因此,cd都是不同对象
- 补充
Integer a = 1;
Integer a = Integer.valueOf(1);
以上两句是等效的,此处自动装箱了。