Integer.valueOf()和自动装箱之间的性能差异是什么

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

Integer.valueOf()和自动装箱之间的性能差异是什么?

这是我的下面的代码:

    int value = 5;

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

    //2 Autoboxing
    Integer result = value;  

注意:我需要整数对象。例如:将其用作HashMap

中的键

我不知道为什么,哪个更快? 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对象。

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

java performance integer autoboxing
1个回答
0
投票

此问题与this question密切相关。正如评论和对链接问题的回答中已经说过的,

自动装箱将调用静态方法Integer.valueOf(),而自动拆箱将在给定的intValue()对象上调用Integer。没别的,真的-只是语法糖。

显然,性能是相同的。但是,this answer所说的事情有些复杂:

无法保证内部自动装箱的方式。

因此,从理论上讲,给定某些奇异的Java编译器,实现可能会有所不同,性能也会有所不同。实际上,没有理由以不同的方式实现自动装箱。此外,如果有更好的实现,则可以将其合并到Integer.valueOf()中。因此,即使那样,性能也将相同。


在Java中,使用替代实现通常没有任何好处。例如,Arrays.copyOfSystem.arraycopy之间曾经存在性能差异,但是AFAIK在Oracle / OpenJDK JVM中对它们进行了优化。

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