Java中Boxing和AutoBoxing的区别是什么?

8
Java中的Boxing和AutoBoxing有什么区别?几本Java认证书籍使用了这两个术语。它们是指相同的Boxing吗?

2
@Tunaki 嗯,并不一定。这可以被视为装箱:Integer i = new Integer(1);和自动装箱Integer i = 1;。然而,这只是无关紧要的语义学问题。 - Kayaman
4
自动装箱是自动完成装箱操作的功能,对吗?您可以使用 Integer.valueOf 手动将 int 装箱,或者将 int 值分配给一个 Integer 变量,它将被自动装箱。 - khelwood
4个回答

15

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

例如,如果您在代码中写入:

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

然后编译器会自动生成装箱代码;代码中的“最终结果”将是:

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

关于为什么要使用Integer.valueOf()而不是new Integer()的说明:基本上,因为JLS这样规定 :) 引用第5.1.7节

如果被包装的值p是true、false、一个范围在\u0000到\u007f之间的byte或char,或者是一个介于 -128 和 127(含)之间的int或short类型的数字,则让r1和r2分别表示p进行两次装箱转换的结果。总是成立:r1 == r2

如果使用“普通”的构造函数,则无法强制执行此要求。而工厂方法,例如Integer.valueOf(),可以实现此要求。


7
在我看来,“Boxing”意味着“明确地在原始值周围构建一个包装器”。例如:
int x = 5;
Integer y = new Integer(x); //or Integer.valueOf(x);

同时,“自动装箱”意味着“隐式地在原始值周围构建包装器”。例如:
Integer x = 5;

0
自动装箱是Java编译器在原始类型和它们对应的对象包装类之间进行的自动转换。例如,将int转换为Integer,double转换为Double等。如果转换反过来,则称为拆箱


0
  • Unboxing 指将包装类转换为原始数据类型。例如,在期望 int 类型时传递 Integer 类型。
  • Autoboxing 是自动将原始数据类型转换为其对应的包装类。例如,在期望 Integer 对象时传递 int。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接