Integer.valueOf()和Autoboxing之间的性能差异是什么?

3
Integer.valueOf()和自动装箱的性能差异是什么?
以下是我的代码:
    int value = 5;

    //1 Integer.valueOf()
    Integer result =  Integer.valueOf(5);

    //2 Autoboxing
    Integer result = value;  

注意:我需要整数对象。例如:将其用作HashMap< Integer,String>中的键。
我不知道为什么以及哪个更快?是Integer.valueOf()(1)还是自动装箱(2)?
关于(1),我检查了Integer.valueOf()的Java代码。看起来他们从缓存中获取Integer对象。
    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

关于 (2) 我听说JVM有自己的Integer池来重用Integer对象。

我试着理解,但仍然不知道为什么和哪个更快?


2
两者速度相同(或者在实践中几乎无关紧要)。如果您想要更快,请使用int(Java中原始类型存在的全部理由是它们速度更快)。自动装箱更易于阅读,因此如果您必须使用包装类型,请使用它。 - Elliott Frisch
1
字节码是相同的。自动装箱在幕后使用Integer.valueOf()。因此性能也是相同的。 - user207421
@ElliottFrisch非常感谢您宝贵的建议。我刚刚编辑了问题,以提供更多详细信息。我有这个问题,是因为我看到Interger.ValueOf从IntegerCache获取Interger对象,但我听说autoboxing似乎从Integer池获取Interger对象。 - Hieu Tran
IntegerCache 是整数池。 - Elliott Frisch
1
@HieuTran,你能否请尽力正确拼写IntegerInteger.valueOf() - user207421
显示剩余9条评论
1个回答

3
这个问题与这个问题密切相关。正如在评论和链接问题的答案中所说,
自动装箱调用静态方法Integer.valueOf(),自动拆箱在给定的Integer对象上调用intValue()。实际上没有其他东西--这只是语法糖。
显然,性能是相同的。然而,事情有点更加复杂,就像这个答案所说的那样:
没有保证自动装箱是如何内部实现的。
因此,在理论上,鉴于某些奇特的Java编译器,实现可能会有所不同,性能也可能会有所不同。实际上,没有理由以不同的方式实现自动装箱。而且,如果有更好的实现,它可能会被纳入Integer.valueOf()中。所以即使那时候,性能也将是相同的。
在Java中,通常没有使用执行相同操作的替代实现的好处。例如,Arrays.copyOfSystem.arraycopy之间曾经有性能差异,但据我所知,它们已经在Oracle / OpenJDK JVM中被优化掉了。

非常感谢您的详细回答 :) 很抱歉,这是我的第一个问题,我刚刚加入stackoverflow,现在无法给您的答案投票。 - Hieu Tran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接