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
对象。
我尝试理解,但仍然不知道为什么,哪个更快?
此问题与this question密切相关。正如评论和对链接问题的回答中已经说过的,
自动装箱将调用静态方法
Integer.valueOf()
,而自动拆箱将在给定的intValue()
对象上调用Integer
。没别的,真的-只是语法糖。
显然,性能是相同的。但是,this answer所说的事情有些复杂:
无法保证内部自动装箱的方式。
因此,从理论上讲,给定某些奇异的Java编译器,实现可能会有所不同,性能也会有所不同。实际上,没有理由以不同的方式实现自动装箱。此外,如果有更好的实现,则可以将其合并到Integer.valueOf()
中。因此,即使那样,性能也将相同。
在Java中,使用替代实现通常没有任何好处。例如,Arrays.copyOf
和System.arraycopy
之间曾经存在性能差异,但是AFAIK在Oracle / OpenJDK JVM中对它们进行了优化。