Java从1.5开始添加了自动装箱与拆箱的机制,可以让我们在Java的变量赋值或者是方法调用等情况下使用原始类型或者对象类型更加简单直接。
自动装箱和拆箱
什么是装箱和拆箱?
装箱是基本类型转换成对应的包装类型,拆箱是包装类型转为对应的基本类型。举个例子:
对于Java的自动装箱和拆箱,我们看看源码编译后的class文件,其实装箱调用包装类的valueOf方法,拆箱调用的是xxxValue方法,下面就是变编译后的代码:
Java中的八种基本类型对应的包装类型的自动装箱和拆箱,每种包装类型都定义了2个方法valueOf装箱方法和xxxValue拆箱方法。
何时装箱和拆箱
上面说过赋值时会自动装箱和拆箱,还有其他情况:
- 进行 = 赋值操作(装箱或拆箱)
- 进行+,-,*,/混合运算 (拆箱)
- 进行>,<,==比较运算(拆箱)
- 调用equals进行比较(装箱)
- 方法调用时(装箱或者拆箱)
- ArrayList,HashMap等集合类 添加基础类型数据时(装箱)
我们看看其中的比较运算,写一段代码并反编译一下看看:
编译结果,在调用的时候发生了装箱,在运算符比较的时候发生了拆箱。
方法重载中的装箱和拆箱
在方法调用的时候,会发生自动装箱和拆箱,但是在方法重载的时候就可能不会装箱和拆箱,在方法重写的时候也一样,有时间可以自己试一试。
拆箱中的空指针
在做拆箱时要小心空指针异常,因为拆箱的时候会调用包装对象的xxxValue方法。
测试结果,发生了空指针异常。
在这篇文章中我们说了Integer中的缓存问题,也是面试常问的面试题。