一、什么是拆箱和装箱

        拆箱:从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)。