本文已参与「新人创作礼」活动,一起开启掘金创作之路。
什么是装箱?什么是拆箱?
-
装箱:把值类型转换为引用类型。例如,将 int 类型的数据转换 Integer 为类型;
-
拆箱:将引用类型转换为值类型。例如,将 Integer 类型的数据转换为 int 类型。
Object obj= "1"; int value = (int)c;
Java中基本数据类型对应的包装类型
| 基本类型 | 封装类型 | 字节长度 | 默认值 |
|---|---|---|---|
| boolean | Boolean | 1 | false |
| byte | Byte | 1 | 0 |
| char | Character | 2 | u0000 |
| short | Short | 2 | 0 |
| int | integer | 4 | 0 |
| long | Long | 8 | 0l或0L |
| float | Float | 4 | 0.0f或0.0F |
| double | Double | 8 | 0.0 |
自动装箱与自动拆箱
装箱
以 Double 和 double 之间的转换为例子:
Double w = 0.01;
上面的例子就是将0.01装在 Double 类型的箱子里,箱子里面的数值是0.01;这个是隐式装箱。
Double d = new Double(0.01);
这个就是显示装箱,生成一个新的箱子 new Double,并且这个箱子的值为2,让 d 指向这个箱子。
拆箱
以 Integer 和 int 之间的转换为例子:
Integer a =5;
int i = a.intValue();
将包装类型 a 中 int 值取出来。最典型的用法就是进行计算的时候,因为包装类型不能直接进行计算,所以需要转换为基本类型进行计算。
何时发生自动装箱和自动拆箱?
-
赋值
Integer obj = 3; // 自动装箱 int base = obj; // 自动拆箱 -
方法调用
public static Integer show(Integer param){ String name = a.getClass().getName(); System.out.println("自动装箱" + param); System.out.println("param的数据类型:" + name); return param; } show(3); //自动装箱,需要的参数类型是Integer,传入的参数是3(int类型) int result = show(3); //自动拆箱,方法的返回值是Integer,而需要的类型是int
自动装箱的弊端
在循环中进行自动装箱操作时,会创建很多多余的对象,影响程序的性能。
Integer sum = 0;
for(int i=2000;i<3000;i++){
sum+=i;
}
在上面这个例子当中,循环体内部的 i 是 int 类型,而 sum 是 Integer 类型,而包装类型是不能直接进行计算的,所以在进行 sum+=i 操作时,会先进行下面的操作:
result = sum.intValue() + i;
Integer sum = new Integer(result);
所以在写循环代码时,应当避免引入不必要的自动装箱操作。