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.copyOf
和System.arraycopy
之间曾经存在性能差异,但是AFAIK在Oracle/OpenJDK JVM中进行了优化。