一、什么是装箱和拆箱
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中的装箱和拆箱](http://img.jiangsulong.com/220420/201I0JR-0.jpg)
文章插图
二、装箱和拆箱的实现过程
通过javap命令对上例反编译得到如下图所示字节码内容:
![java中的装箱和拆箱](http://img.jiangsulong.com/220420/201I0LQ-1.jpg)
文章插图
由上图可知 , 在装箱的时候自动调用的是Integer的valueOf(int)方法 , 在拆箱的时候自动调用的是Integer的intValue方法 。
【java中的装箱和拆箱】事实上 , 装箱过程就是通过调用包装器的valueOf方法实现 , 而拆箱过程是通过调用包装器的 xxxValue方法实现 。(xxx代表对应的基本数据类型)
三、一道面试题
下面代码块的输出结果是什么?
![java中的装箱和拆箱](http://img.jiangsulong.com/220420/201I03U2-2.jpg)
文章插图
答案是:
true false
原因分析:i1 , i2 , i3和i4都进行了自动装箱 , 也即执行了valueOf函数 , 函数源码(jdk1.8.0_111)如下:![java中的装箱和拆箱](http://img.jiangsulong.com/220420/201I0N21-3.jpg)
文章插图
其中 , IntegerCache的实现如下:
![java中的装箱和拆箱](http://img.jiangsulong.com/220420/201I0LI-4.jpg)
文章插图
从源码可知 , 如果数值在[-128,127]之间 , 则返回IntegerCache.cache中已经存在的对象的引用 , 否则创建一个新的Integer对象 。而100在[-128,127]之间 , 200在该范围之外 , 故i1和i2指定同一对象 , 而i3和i4指定不同对象 。
对于其他类型的自动装箱分析可参考以上思路 , 结果可能会因为valueOf的具体实现而不同 。
推荐阅读
- 2019年的6个JavaScript用户认证库
- 又一个小而美的Java Web框架:Solon
- 万字详文:Java内存泄漏、性能优化、宕机死锁的N种姿势
- 《红楼梦》里的大观园在荣国府里面吗 红楼梦中的荣国府在哪里
- 翡翠|如果你没有时间,去观赏自然界中的美好,那么就欣赏山水牌翡翠
- javascript 知识普及之 FormData
- C语言中的动态内存分配与变长数组
- 技术转载 || 使用java API进行zip递归压缩文件夹以及解压
- 简介机器学习中的特征工程
- 两万字长文读懂 Java 集合