扩展java Integer缓存

由于缓存,一般建议使用Integer.valueOf(int)而不是new Integer(int)

在JDK 5+中,您应该使用valueOf因为Integer现在可以在-128127之间缓存Integer对象,并且每次都可以将同一个Integer(0)对象交给您,而不是在全新的相同Integer对象上浪费对象构造。

如何扩大范围?

您可以使用java.lang.Integer.IntegerCache.high属性来增加此缓存的大小。
例如:

 java -Djava.lang.Integer.IntegerCache.high=4096 SomeClass.class 

我的问题是:

1)为什么你的代码制作新的Integer对象会伤害你? 你有一个分享的个人资料结果,以certificate制作太多整数会减慢你的速度吗? 通常,对象池是一个不好的想法。 你需要一个好的案例来certificate这一点。

2)你为什么要做新的Integer(int)? 如果你只是把它保存为原始int,你不仅会避免“创建一个新对象”。 你根本不会创建任何对象。 如果您以后需要它,自动装箱将处理将其转换为整数。

*免责声明我不使用EITHER ..我编写性能敏感的代码,但从未达到过我将手动将原始int转换为整数的程度。 我只是尽可能保持int,如果需要,让JVM自动装箱。

扩展缓存的范围可能无法满足您的需求,但如果您确实需要缓存更大的范围,则可以使用此代码而不是Integer.valueOf(int)。 您只需将缓存范围值调整到所需的范围即可。

 private static class IntegerCache { private IntegerCache(){} static final Integer cache[] = new Integer[-(-128) + 127 + 1]; static { for(int i = 0; i < cache.length; i++) cache[i] = new Integer(i - 128); } } public static Integer valueOf(int i) { final int offset = 128; if (i >= -128 && i <= 127) // must cache { return IntegerCache.cache[i + offset]; } return new Integer(i); } 

代码来自: http : //www.owasp.org/index.php/Java_gotchas

这就是添加整数缓存的原因 :

[…]根据语言规范的要求,支持-128和127(含)之间的值的自动装箱的对象标识语义。

如果您分析了应用程序,并且发现创建Integer对象是一个热点,那么请务必复制整数缓存代码并使用不同的范围编写自己的代码。 否则,您可以更好地花时间寻找真正的热点并改善它们。

显然,-XX:+ AggressiveOpts将最大值设置为20000.请参阅有关整数缓存有多大的答案?