鉴于以下代码,Java编译器是否应用任何装箱/拆箱这种情况?
public static Integer sum(Iterable<Integer> numbers){
Integer sum = 0;
for(Integer n : numbers){
sum += n;
}
return sum;
}
是的,Integer
对象在使用int
运算符执行添加时转换为+
文字。看看这个link。它说如下:
因为余数(%)和一元加号(+ =)运算符不适用于Integer对象,您可能想知道为什么Java编译器在不发出任何错误的情况下编译该方法。编译器不会生成错误,因为它调用intValue方法在运行时将Integer转换为int。
这里int 0被自动装箱为一个整数和:
Integer sum = 0;
这里的值是未装箱的,因为一元加运算符仅适用于int:
sum += n;
迭代Integers时,不会发生拆箱:
for(Integer n : numbers)
如果你这样做,可以在for循环中取消装箱:(例如):
for(int n : numbers)
有关非常相似的示例和解释,请参阅Autoboxing and Unboxing。