当前位置: 首页 > 知识库问答 >
问题:

在Java中,具有包装器对象返回值(例如整数)是否会导致自动装箱?

管峻
2023-03-14

我无法为这个看似简单的问题找到明确的答案。如果我写一个这样的方法:

public Integer getAnInt() {
  int[] i = {4};
  return i[0];
}

返回值是自动装箱到 Integer 中,还是取决于返回后值会发生什么变化(例如,它被分配到的变量是声明为 Integer 还是 int)?

共有2个答案

文寒
2023-03-14

你在问两个不同的问题,区分它们很重要。第一个是语言层面的问题:在< code>return这样的上下文中,语言如何调解< code>int和< code>Integer之间的区别。第二个是(暗示)一个成本模型问题——返回< code>Integer会导致无用的堆分配吗?许多开发人员将两者混为一谈。

对于第一个问题,您有一个返回< code>Integer但返回类型为< code>int的表达式的方法。从本质上讲,退货被视为转让;您正试图将< code>int赋值给< code>Integer。JLS 5.2说在赋值上下文中允许装箱转换。所以,是的,< code>int将成为装箱转换的对象。

但是,你问这个问题的事实表明,你在某种程度上害怕拳击的性能开销,因此你的问题的第二个隐含部分。这是它变得(a)模糊,(b)可能无关紧要的地方。在运行时,堆分配是否实际发生取决于 (a) int 是否较大(装箱缓存小整数的框)和 (b) 方法是否内联。如果该方法是内联的,JIT将看到您正在进入int -

洪鸿
2023-03-14

它将(自动)装箱在字节码(.class文件)中,因为它是公共API的一部分,因此其他代码可能依赖于返回值是整数

在适当的情况下,JITter可能会在运行时删除装箱和拆箱,但我不知道它是否能做到这一点。

 类似资料:
  • 问题内容: 这是自动装箱吗? 上面的代码是否会先将int文字8包装为Integer,然后将其引用分配给变量ob?因为Java语言规范在这种情况下没有任何帮助。 问题答案: 上面的代码是否会先将int文字8包装为Integer,然后将其引用分配给变量ob? 是。(或者更确切地说,它将把值装箱到一个对象中,然后将引用分配给变量。实际上,整数值是文字的事实在这里是无关紧要的。例如,它可以是return的

  • 我正在用下面的代码比较两个整数对象....为什么输出是“Both Integer are not equal...”虽然我在某处读到过,Integer或int将只在-128到127的范围内相等。为什么不是128?

  • 问题内容: 我用如下猫鼬定义了一个模型: 然后创建了一个用户,可以通过mongo控制台完美地找到它,如下所示: 但是,当我尝试通过带有mongoose的node.js访问此对象时,要检索的对象不是此类文档,而是包装器: 这段代码… 从console.dir(doc)产生此输出… 因此,密码将不匹配,因为doc.password未定义。 为什么会这样呢? 问题答案: 这正是包裹猫鼬对象的猫鼬的目的。

  • 我已经看到变量的原始版本和对象版本之间有以下映射: 浮- 所以,对他们所有人来说,唯一的区别就是世界上的第一个字母。我想知道为什么这个规则不适用于变成整数(而不是int)的int和变成字符而不是(char)的char。 我不知道这是否是问这个问题的正确地方,但我真的很想知道这个选择是否有原因,即使因为我教孩子们java,他们也经常问我同样的问题。

  • 使用一个新建的包装类来替换一个方法的返回值, 这个类也可以是已存在的类. 操作步骤: 菜单栏: Refactor —> Wrap Return Value...

  • 为什么我们可以将int值和char值都赋给Character Wrapper类型。Autoboxing意味着对相应包装进行装箱,但Character不是int的相应包装。它是Integer 为什么这两种说法都是可能的