java中的装箱和拆箱

一、什么是装箱和拆箱
JAVA中基本数据类型与它们的包装类进行运算时 , 编译器会自动帮我们进行转换 , 转换过程是透明的 。其中 , 装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型 。
基本数据类型:int(4字节)、byte(1字节)、short(2字节)、long(8字节)、float(4字节)、double(8字节)、char(2字节)、boolean(未定)
对应包装类型:Integer、Byte、Short、Long、Float、Double、Char、Boolean
一个简单例子:

java中的装箱和拆箱

文章插图
 
二、装箱和拆箱的实现过程
通过javap命令对上例反编译得到如下图所示字节码内容:
java中的装箱和拆箱

文章插图
 
由上图可知 , 在装箱的时候自动调用的是Integer的valueOf(int)方法 , 在拆箱的时候自动调用的是Integer的intValue方法 。
【java中的装箱和拆箱】事实上 , 装箱过程就是通过调用包装器的valueOf方法实现 , 而拆箱过程是通过调用包装器的 xxxValue方法实现 。(xxx代表对应的基本数据类型)
三、一道面试题
下面代码块的输出结果是什么?
java中的装箱和拆箱

文章插图
 
答案是:
true false原因分析:i1 , i2 , i3和i4都进行了自动装箱 , 也即执行了valueOf函数 , 函数源码(jdk1.8.0_111)如下:
java中的装箱和拆箱

文章插图
 
其中 , IntegerCache的实现如下:
java中的装箱和拆箱

文章插图
 
从源码可知 , 如果数值在[-128,127]之间 , 则返回IntegerCache.cache中已经存在的对象的引用 , 否则创建一个新的Integer对象 。而100在[-128,127]之间 , 200在该范围之外 , 故i1和i2指定同一对象 , 而i3和i4指定不同对象 。
对于其他类型的自动装箱分析可参考以上思路 , 结果可能会因为valueOf的具体实现而不同 。




    推荐阅读