Java包装类缓存
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 }