一、Java为什么要有装箱和拆箱

如果是基本类型,直接使用不就可以了吗? 为什么还要转化为基本类型类?

简单来说,是Java早年设计缺陷。基础类型是数据,不是对象,也不是Object的子类。需要装箱才能和其他Object的子类共用同一个接口,比如:foo(Object o)

详细来说,把一个基本类型包装成一个类,主要有三个好处:

1. 可以使这个类型具有很多可以调用的方法。

2. 使Java向面向对象语言的靠近。其实Java还不算是很纯的面向对象的语言。真正的面向对象,是没有基本数据类型的。它只有一种类型,就是对象。

3. 在泛型中,基本类型是不可以做泛型参数的。如:

 

  •  
List <int> list = new ArrayList<int> ();

这是不合法的!只能这个样子写:

  •  
List<Integer> list = new ArrayList<Integer> ();

也就是要用int型的包装类类型来解决基本类型不可以做泛型参数的问题 。

总之,包装类有更多的方法和用途, 而这是基本类型没有的!

二、什么是自动装箱、拆箱

首先抛出定义,Java中基础数据类型与它们的包装类进行运算时,编译器会自动帮我们进行转换,转换过程对程序员是透明的,这就是装箱和拆箱,装箱和拆箱可以让大家的代码更简洁易懂。

Java中基础数据类型与它们对应的包装类见下表(共8种)

原始类型

包装类型

boolean

Boolean

byte

Byte

char

Character

float

Float

int

Integer

long

Long

short

Short

double

Double

当表格中左边列出的基础类型与它们的包装类有如下几种情况时,编译器会自动帮我们进行装箱或拆箱。

进行 = 赋值操作(装箱或拆箱)

进行+,-,*,/混合运算 (拆箱)

进行>,<,==比较运算(拆箱)

调用equals进行比较(装箱)

ArrayList,HashMap等集合类添加基础类型数据时(装箱)

三、自动装箱、拆箱的坑(面试题)

装箱拆箱面试题1: 看程序写结果

  •  
Integer value3 = 127; //自动装箱Integer value4 = 127;System.out.println(value3 == value4);System.out.println(value3.equals(value4)); 
答案:true true

装箱拆箱面试题2: 看程序写结果

  •  
Integer value5 = 128;Integer value6 = 128;System.out.println(value5==value6); System.out.println(value5.equals(value6)); 

答案: false true

解析总结: 自动装箱,范围在 -128 ~ 127 (256个数字 )的地址是一样的,其他范围地址不一样,-128 到 127 之间的有个自动装箱的缓存池,如果不在这个范围,就会使用new 新创建,因此,题目1的System.out.println(value3 == value4);输出结果是true;题目2的System.out.println(value5==value6); 输出结果是false。