<返回更多

java中的装箱和拆箱

2020-08-11    
加入收藏

一、什么是装箱和拆箱

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方法。

事实上,装箱过程就是通过调用包装器的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的具体实现而不同。

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>