Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做自动装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱。自动装箱和拆箱使Java在复制和方法调用时更加方便。
什么是自动装箱和拆箱?
自动装箱和拆箱是指装箱和拆箱过程是非人为的。基本类型byte,short,char,int,long,float,double和boolean可以自动转换为包装类Byte,Short,Character,Integer,Long,Float,Double,Boolean。
public class Main {
public static void main(String[] args) {
Integer int1= 1;//自动装箱
int int2= int1;//自定拆箱
}
}
自动装箱拆箱要点
自动装箱时编译器调用valueOf将原始类型值转换成对象,同时自动拆箱时,编译器通过调用类似intValue(),doubleValue()这类的方法将对象转换成原始类型值。
自动装箱是将boolean值转换成Boolean对象,byte值转换成Byte对象,char转换成Character对象,float值转换成Float对象,int转换成Integer,long转换成Long,short转换成Short,自动拆箱则是相反的操作。
使用==判断基本类型及其包装类指是否相等
这是一种不常见的情况
Integer int1 = 1;
int int2 = 1;
System.out.println(int1 == int2);//true
用==判断int1和int2值是否相等时,出于两个考虑:
- 首先将int2自动装箱,由于是Integer自动装箱-128到127之间的值都使用系统缓存的值,这种情况会导致int1和int2实际上是两个一样的Integer对象,使用==判断地址是否相同,返回true;
- 首先将int1拆箱,==实际上判断两个基本类型是否相等,返回true。
经过在java.lang.Integer源码的装箱和拆箱代码打断点测试,这一过程实际上用了自动拆箱的方法。