一、什么是拆箱和装箱
拆箱:从object类型到值类型或从接口类型到实现该接口的值类型的显示转换。
装箱:用于在垃圾回收堆中储存值类型。装箱是值类型到Object类型或到此类型所实现的任何接口类型的隐式转换。
简单来说,装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。装箱与拆箱的操作,会带来很大的性能损耗。
二、为什么要有拆箱和装箱
其一,Java是一种完全面向对象的语言。因此,包括数字、字符、日期、布尔值等等在内的一切,都是对象。对于CPU来说,处理一个完整的对象,需要很多的指令,对于内存来说,又需要很多的内存。如果连整数都是对象,那么性能自然很低。于是创造了这样一种机制,使得这些基本类型在一般的编程中被当作非对象的简单类型处理,在另一些场合,又允许它们被视作是一个对象。这就是装箱和拆箱。
作用:为了保证通用性和提高系统性能
一种最普通的场景是调用一个包含类型为Object的参数的函数(方法),该Object可支持任意 类型,以便通用。当你需要将一个值类型传入容器时,就需要装箱了。
另一种的用法,就是一个泛型的容器,同样是为了保证通用,而将元素定义为Object类型的,将值类型的值加入该容器时,需要装箱。
其二,在泛型中,基本类型是不可以做泛型参数的。如:
List<int> list = new ArrayList<int>(); //不合法
List<Integer> list = new ArrayList<Integer>(); //合法
也就是要用int型的包装类类型来解决基本类型不可以做泛型参数的问题 。
一名话,包装类有更多的方法和用途, 而这是基本类型没有的!!!
基本数据类型对应的包装类
基本数据类型 | 对应的包装类 |
---|---|
byte(1字节) | Byte |
short(2字节) | Short |
int(4字节) | Integer |
long(8字节) | Long |
float(4字节) | Float |
double(8字节) | Double |
boolean(未定) | Boolean |
char(2字节) | Character |
二、如何实现拆箱和装箱
在JDK1.5之前,要生成一个数值为10的Integer对象,如下:
Integer i = new Integer(10);
从JDK1.5开始就提供了自动装箱的功能,要生成一个数值为10的Integer对象,如下:
Integer i = 10; //这个过程中会自动根据数值创建对应的 Integer对象,这就是装箱。
int j = i; //拆箱(进行赋值或者逻辑运算时会自动进行拆箱)(将引用类型Integer的i转换成值类型int的i,然后进行赋值或者四则运算)
装箱是通过调用包装器类的 valueOf 方法实现的
拆箱是通过调用包装器类的 xxxValue 方法实现的,xxx代表对应的基本数据类型(int,short,long,double,byte,char,float,boolean)。