什么是自动装箱和自动拆箱?

368 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

什么是装箱?什么是拆箱?

  • 装箱:把值类型转换为引用类型。例如,将 int 类型的数据转换 Integer 为类型;

  • 拆箱:将引用类型转换为值类型。例如,将 Integer 类型的数据转换为 int 类型。

     Object obj= "1";
     int value = (int)c;
    

Java中基本数据类型对应的包装类型

基本类型封装类型字节长度默认值
booleanBoolean1false
byteByte10
charCharacter2u0000
shortShort20
intinteger40
longLong80l或0L
floatFloat40.0f或0.0F
doubleDouble80.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);

所以在写循环代码时,应当避免引入不必要的自动装箱操作。