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 }

 

posted @ 2017-02-24 12:43  旧城孤音  阅读(1403)  评论(0编辑  收藏  举报