简而言之
装箱是基本数据类型转换为引用数据类型
拆箱是引用数据类型转换为基本数据类型
以int型为例
public class Test {
public static void main(String[] args){
//自动装箱,底层执行了Integer a=Integer.valueOf(1);
Integer a = 1;
//自动拆箱,底层执行了int b=a.intValue();
int b = a;
}
}
Integer的valueOf(int i)方法可以将一个基本数据类型转化为对应的包装类型,即装箱方法。
而Integer的intValue()方法则可以将一个包装类型转化为对应的基本数据类型,即拆箱方法。
/*基本数据类型与包装类型的对应关系如下
基本数据类型 | 包装类型 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
*/
自动装箱相对于装箱效率更高
前者会根据具体数值决定是否生成新对象,还是返回缓存对象的引用,后者直接生成新对象
异常分析
Integer a = null;
int b = a;
很明显,空指针异常,自动拆箱,确保包装类的引用不为空