对于这个看似简单的问题,我找不到明确的答案。如果我写一个这样的方法:
public Integer getAnInt() {
int[] i = {4};
return i[0];
}
返回值是否自动装箱为 Integer,还是取决于返回值后发生的情况(例如,分配给它的变量是否被声明为 Integer 或 int)?
您在问两个不同的问题,将它们分开很重要。第一个是语言层面的问题:语言如何调节两者之间的差异?int
and Integer
在这样的背景下return
。第二个是(暗示)成本模型问题——将返回Integer
导致无用的堆分配。许多开发人员将两者混为一谈。
对于第一个问题,你有一个返回的方法Integer
但操作数为return
是类型的表达式int
。本质上,返回被视为赋值;你正在尝试分配int
to Integer
。 JLS 5.2 规定在赋值上下文中允许进行装箱转换。所以是的,那个int
将成为拳击转换的主题。
但您提出这个问题的事实表明,您不知何故害怕拳击的性能开销,因此是您问题的第二个隐含部分。这就是它变得(a)模糊,(b)可能无关紧要的地方。在运行时,堆分配是否实际发生取决于 (a) int 是否很大(装箱缓存小整数的框)和 (b) 该方法是否内联。如果该方法是内联的,JIT 将看到您正在进行 int -> Integer -> int 并忽略转换。
而且,即使拳击发生了,这真的很重要吗?需要多少亿级拳击操作才能将其显示在您的性能指标上?即使您支付装箱的全部成本,短期临时对象的分配和垃圾收集也非常便宜。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)