1、装箱机制
基础类型引用到其包装类型,这样就可以调用其各种方法。
例如,我们声明:
Integer a = 1;
其在编译过程中会自动解释成:
Integer a = Integer.valueOf(1);
这就是自动装箱的过程。
2、拆箱机制
与装箱相反,将引用类型简化为基础类型。
例如我们在进行比较时:
Integer a = 1;
System.out.println(a == 1); // 2
2在编译中会将Integer类型的a自动拆箱,解释为:
int a = new Integer(1);
然后再去与1进行对比。
注意:自动装箱和拆箱是由编译器来完成的,编译器会在编译期根据语法决定是否进行装箱和拆箱动作。
3、缓存机制
-
Integer i1 = 100;
-
Integer i2 = 100;
-
Integer i3 = 200;
-
Integer i4 = 200;
-
System.out.println(i1 == i2);
-
System.out.println(i3 == i4);
最后的运行结果 分别是 true 和 false!
既然 Integer声明时会被自动装箱为Integer.valueOf(int i)的方法,我们可以看看Integer源码。
发现当 i 的值在-128到127之间时会直接返回内部缓存池中已经存在对象的引用,而这个范围就叫做自动装箱池,而当参数是其范围之外时则会新建对象并返回对象,这样就能解释以上的结果了。
同样的,可以看看其它的封装类会是什么情况?
对应的自动装箱池大小如下:
Byte,Short,Long对应的是-128~127
Character对应的是0~127
Float和Double没有自动装箱池