由于缓存的原因,我们建议使用Integer.valueOf(int)
而不是new Integer(int)
。扩展java Integer缓存
在JDK 5+,你应该使用valueOf
因为Integer
现在缓存-128
和127
之间Integer
对象,可以交给你回来完全相同Integer(0)
对象每次而不是一个全新的相同Integer
对象浪费了一个对象的建设。
如何扩展范围?
由于缓存的原因,我们建议使用Integer.valueOf(int)
而不是new Integer(int)
。扩展java Integer缓存
在JDK 5+,你应该使用valueOf
因为Integer
现在缓存-128
和127
之间Integer
对象,可以交给你回来完全相同Integer(0)
对象每次而不是一个全新的相同Integer
对象浪费了一个对象的建设。
如何扩展范围?
我的问题,你是:
1)为什么你的代码作出新的Integer对象伤害你?你有没有要分享的个人资料结果,以证明制作太多的整数会让你失望?总的来说,对象池是一个糟糕的想法。你需要一个好的案例来证明它的合理性。
2)为什么你在做新的整数(int)?如果你只是把它保持为一个原始的int,你不仅会避免“创建一个新的对象”。你根本不会创建任何对象。如果您稍后需要它,自动装箱会将其转换为整数。
*免责声明我不使用..我写性能敏感的代码,但从来没有到一个点,我会手动将原始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);
}
可以使用java.lang.Integer.IntegerCache.high属性来增加这个缓存的大小。
例如:
java -Djava.lang.Integer.IntegerCache.high=4096 SomeClass.class
This is why the integer cache was added:
[...],以支持自动装箱为-128和127(含)之间的值的对象标识语义所要求的语言规范。
如果您对应用程序进行了剖析并且发现创建Integer对象是一个热点,那么请务必复制整数高速缓存代码并使用不同的范围编写自己的代码。否则你的时间会更好地花在寻找真正的热点并改进它们。
显然,-XX:+ AggressiveOpts设置最高至20000参见How large is the Integer cache?
答案虽然你没有明确回答OP的问题,我100%在这里与你同意。汇集这样的“便宜”对象几乎肯定是一个坏主意。 – Waldheinz 2010-10-14 14:55:30