3

有一个一般建议可以使用Integer.valueOf(int),而不是new Integer(int)因为缓存。

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

怎样才能扩大范围?

4

5 回答 5

12

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

java -Djava.lang.Integer.IntegerCache.high=4096 SomeClass.class
于 2010-10-14T17:03:46.850 回答
2

我对你的问题是:

1) 为什么你的代码制作新的 Integer 对象会伤害你?您是否有个人资料结果要分享,以证明制作太多整数会减慢您的速度?一般来说,对象池是一个坏主意。你需要一个好的案例来证明它的合理性。

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

*免责声明我不使用任何一个..我编写性能敏感代码,但从未达到手动将原始 int 转换为 Integer 的地步。我只是尽可能保留为 int,如果需要,让 JVM 自动装箱。

于 2010-10-14T14:39:04.347 回答
1

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

[...] 以支持语言规范要求的 -128 和 127(含)之间的值的自动装箱的对象身份语义。

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

于 2011-04-03T09:40:43.433 回答
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);
}

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

于 2010-10-14T14:50:00.437 回答
1

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

于 2014-03-07T22:22:43.860 回答