一、什么是装箱和拆箱
JAVA中基本数据类型与它们的包装类进行运算时,编译器会自动帮我们进行转换,转换过程是透明的。其中,装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。
基本数据类型:int(4字节)、byte(1字节)、short(2字节)、long(8字节)、float(4字节)、double(8字节)、char(2字节)、boolean(未定)
对应包装类型:Integer、Byte、Short、Long、Float、Double、Char、Boolean
一个简单例子:
二、装箱和拆箱的实现过程
通过javap命令对上例反编译得到如下图所示字节码内容:
由上图可知,在装箱的时候自动调用的是Integer的valueOf(int)方法,在拆箱的时候自动调用的是Integer的intValue方法。
事实上,装箱过程就是通过调用包装器的valueOf方法实现,而拆箱过程是通过调用包装器的 xxxValue方法实现。(xxx代表对应的基本数据类型)
三、一道面试题
下面代码块的输出结果是什么?
答案是:
true
false
原因分析:i1,i2,i3和i4都进行了自动装箱,也即执行了valueOf函数,函数源码(jdk1.8.0_111)如下:
其中,IntegerCache的实现如下:
从源码可知,如果数值在[-128,127]之间,则返回IntegerCache.cache中已经存在的对象的引用,否则创建一个新的Integer对象。而100在[-128,127]之间,200在该范围之外,故i1和i2指定同一对象,而i3和i4指定不同对象。
对于其他类型的自动装箱分析可参考以上思路,结果可能会因为valueOf的具体实现而不同。