在java中什么是自动装箱和拆箱?java语言从1.5之后,可以自动将原始类型与对象进行相互转换,不用编程转换,被称为java自动装箱和拆箱。将原始类型转换为对象称为自动装箱,例如将int转换为Integer,将对象转换为原始类称为自动拆箱,例如将Integer转换为int。自动装箱和拆箱支持的原始类型和类有:byte和Byte ,char和Character,short和Short,int和Integer,long和Long,double和Double以及boolean和Boolean。
自动装箱和拆箱的原理原理上,自动装箱时,调用了对应类的valueOf()方法,下面的两行代码,实际上是等价的:
Integer i = 1;
Integer i = Integer.valueOf(1);
在没有自动装箱特性时,只能使用第二种写法。
在自动拆箱时,实际调用了对象的xxxValue()方法。下面两段代码也是等价的:
Integer i = new Integer(1);
int j = i;
或
Integer i = new Integer(1);
int j = i.intValue();
在没有自动拆箱特性时,只能使用第二种写法。
自动装箱和拆箱的坑自动装箱和拆箱可以简化代码的编写,不用工程师手动进行装箱和拆箱。当然,大家在享受这个方便的特性时,也要注意避免踩坑,给程序带来bug。
比较常见的问题是自动拆箱时,被拆的对象为null。原始类型在编写过程中都有初始值,没有初始值会被编译器检查出来,不能通过,所以一般情况下,自动装箱不存在没有初始值的情况。但是在拆箱时,被拆箱的对象有可能是null,这个时候进行拆箱,会抛出NullPointerException。因此,调用方法的参数是原始类型时,要特别注意,传递的对象是否为null。
另一个常见的问题是使用运算重载符时,会生成新的对象,如果在大量的循环中使用,会生成大量的临时对象,影响性能。