Java中的Boxing和AutoBoxing有什么区别?几本Java认证书籍使用了这两个术语。它们是指相同的Boxing吗?
拳击是一种机制(例如,从int
到Integer
);自动装箱是编译器的一项功能,它可以为您生成装箱代码。
例如,如果您在代码中写入:
// 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()
,可以实现此要求。
int x = 5;
Integer y = new Integer(x); //or Integer.valueOf(x);
Integer x = 5;
Integer i = new Integer(1);
和自动装箱Integer i = 1;
。然而,这只是无关紧要的语义学问题。 - KayamanInteger.valueOf
手动将int
装箱,或者将int
值分配给一个Integer
变量,它将被自动装箱。 - khelwood