1.基本概念
在jdk1.5及之后的版本中,Java在5大包装类中(Byte,Charactor,Short,Integer,Long)增加了相应的私有静态成员内部类为相应包装类对象提供缓存机制,Integer包装类的内部缓存类源码如下:
正如源码中所指,在自动装箱的基础上,缓存机制才会发生作用,当包装类加载时,内部类会初始化一个长度为((high-low)+1)的包装类类型数组,low有固定值为-128,而high的默认值为127,还可以通过系统配置文件进行修改,自定义high的取值范围是127-----(Interger.MAX_VALUE+127),Integer.MAX_VALUE是int类型变量的最大正数取值,其缓存机制是:当通过自动装箱机制创建包装类对象时,首先会判断数值是否在-128----127的范围内,如果满足条件,则会从缓存中寻找指定数值,若找到缓存,则不会新建对象,只是指向指定数值对应的包装类对象,否则,新建对象。
2.经典笔试题
1 /**
2 * Created by andrew on 2017/2/24.
3 */
4 public class Test {
5 public static void main(String[] args) {
6 Integer a = new Integer(100);
7 Integer b = new Integer(100);
8 // 输出为false,非自动装箱机制实现,属于两个不同的对象,所以返回false.
9 System.out.println(a == b);
10
11 Integer a1 = 100;
12 Integer b1 = 100;
13 // 输出为true," == "在此处比较的是两边对象的地址值,
14 // 在定义b1对象的时候,因为100在-128---127的范围内,而且寻找到了缓存对象a1,
15 // 所以引用b1直接指向a1对象,不会新建对象,两个引用指向是同一个对象,所以返回true.
16 System.out.println(a1 == b1);
17
18 Integer a2 = 1000;
19 Integer b2 = 1000;
20 // 输出为false," == "在此处比较的是两边对象的地址值,
21 // 在定义b2对象的时候,因为1000不在-128---127的范围内,不会实现缓存机制,因此会新建包装类对象,
22 // 属于两个不同的对象,所以返回false.
23 System.out.println(a2 == b2);
24
25
26 }
27 }