Java 中的装箱和自动装箱有什么区别?

What is the difference between Boxing and AutoBoxing in Java?

Java中装箱和自动装箱有什么区别?有几本 Java 认证书籍使用了两个这样的术语。他们指的是拳击吗?

在我的理解中,"Boxing"表示"explicitly constructing a wrapper around a primitive value"。例如:

int x = 5;
Integer y = new Integer(x); //or Integer.valueOf(x);

同时,"Autoboxing"表示"implicitly constructing a wrapper around a primitive value"。例如:

Integer x = 5;

Autoboxing 是 Java 编译器在原始类型和它们对应的对象包装器 类 之间进行的自动转换。例如,将 int 转换为 Integer,将 double 转换为 Double,等等。如果转换以另一种方式进行,则称为 拆箱

ref...

装箱是机制(即从intInteger);自动装箱是编译器的一项功能,它可以为您生成装箱代码。

例如,如果你写代码:

// list is a List<Integer>
list.add(3);

然后编译器自动为你生成装箱代码;代码中的 "end result" 将是:

list.add(Integer.valueOf(3));

关于为什么 Integer.valueOf() 而不是 new Integer() 的说明:基本上,因为 JLS 这么说 :) 引用 section 5.1.7:

If the value p being boxed is true, false, a byte, or a char in the range \u0000 to \u007f, or an int or short number between -128 and 127 (inclusive), then let r1 and r2 be the results of any two boxing conversions of p. It is always the case that r1 == r2.

如果您使用 "mere" 构造函数,则无法强制执行此要求。一个工厂方法,比如Integer.valueOf(),可以。

  • 拆箱是从wrapper-class到原始数据类型的转换。例如。当你传递一个整数而期望一个整数时。
  • 自动装箱 是从原始数据类型自动转换为相应的包装器-class。例如。当您传递一个 int 而期望一个 Integer 对象时。