在此代码中是否发生任何装箱/拆箱?

问题描述 投票:2回答:2

鉴于以下代码,Java编译器是否应用任何装箱/拆箱这种情况?

public static Integer sum(Iterable<Integer> numbers){
    Integer sum = 0;
    for(Integer n : numbers){
        sum += n;
    }

    return sum;
}
java boxing autoboxing
2个回答
1
投票

是的,Integer对象在使用int运算符执行添加时转换为+文字。看看这个link。它说如下:

因为余数(%)和一元加号(+ =)运算符不适用于Integer对象,您可能想知道为什么Java编译器在不发出任何错误的情况下编译该方法。编译器不会生成错误,因为它调用intValue方法在运行时将Integer转换为int。


1
投票

这里int 0被自动装箱为一个整数和:

Integer sum = 0;

这里的值是未装箱的,因为一元加运算符仅适用于int:

sum += n;

迭代Integers时,不会发生拆箱:

for(Integer n : numbers)

如果你这样做,可以在for循环中取消装箱:(例如):

for(int n : numbers)

有关非常相似的示例和解释,请参阅Autoboxing and Unboxing

© www.soinside.com 2019 - 2024. All rights reserved.