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