由于缓存,使用Integer.valueOf(int)
代替new Integer(int)
的一般建议。
在JDK 5+中,您应该真正使用valueOf
因为Integer
现在在Integer
和-128
之间缓存127
个对象,并且可以将您的对象移回每次精确Integer(0)
个对象,而不是在全新的相同Integer
对象上浪费对象构造。
如何扩展范围?
答案 0 :(得分:12)
您可以使用java.lang.Integer.IntegerCache.high属性来增加此缓存的大小。
例如:
java -Djava.lang.Integer.IntegerCache.high=4096 SomeClass.class
答案 1 :(得分:1)
我的问题是:
1)为什么你的代码会让新的Integer对象伤害你?你有一个分享的个人资料结果,以证明制作太多的整数会减慢你的速度吗?通常,对象池是一个不好的想法。你需要一个好的案例来证明这一点。
2)你为什么要做新的Integer(int)?如果你只是把它保存为原始int,你不仅会避免“创建一个新对象”。你根本不会创建任何对象。如果您以后需要,自动装箱将处理将其转换为整数。
*免责声明我不使用EITHER ..我编写性能敏感的代码,但从未达到过我将手动将原始int转换为整数的程度。我只是尽可能保持int,如果需要,让JVM自动装箱。
答案 2 :(得分:1)
扩展缓存的范围可能无法满足您的需求,但如果您确实需要缓存更大的范围,则可以使用此代码而不是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);
}
答案 3 :(得分:1)
This is why the integer cache was added:
[...]支持自动装箱的对象标识语义,用于-128和127(含)之间的值,符合语言规范的要求。
如果您分析了应用程序,并且发现创建Integer对象是一个热点,那么请务必复制整数缓存代码并使用不同的范围编写自己的代码。否则,你可以更好地花时间寻找真正的热点并改善它们。
答案 4 :(得分:1)
显然,-XX:+ AggressiveOpts将最大值设置为20000.请参阅How large is the Integer cache?上的答案