一、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。
发表评论 取消回复