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



Integer.valueOf()和自动装箱的性能有什么区别?

这是我下面的代码:

int value = 5;
//1 Integer.valueOf()
Integer result =  Integer.valueOf(5);
//2 Autoboxing
Integer result = value;  

注意:我需要整数对象。例如:将其用作哈希映射中的键<整数,字符串>

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

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

这个问题与这个问题密切相关。正如评论和对链接问题的回答中已经说过的那样,

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

显然,性能是一样的。但是,事情有点复杂,因为这个答案说:

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

因此,从理论上讲,给定一些奇特的Java编译器,实现可能会有所不同,性能也可能有所不同。实际上,没有理由以不同的方式实现自动装箱。此外,如果有更好的实现,它可能会被纳入Integer.valueOf()。因此,即使这样,性能也是一样的。


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

最新更新