Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
扩展java整数缓存_Java_Caching_Integer_Boxing - Fatal编程技术网

扩展java整数缓存

扩展java整数缓存,java,caching,integer,boxing,Java,Caching,Integer,Boxing,由于缓存的原因,一般建议使用Integer.valueOf(int)而不是newinteger(int) 在JDK 5+中,您应该真正使用valueOf,因为Integer现在在-128和127之间缓存Integer对象,并且可以返回相同的整数(0)每次都创建一个对象,而不是将对象构造浪费在一个全新的相同的Integer对象上 如何扩大范围?我想问你的问题是: 1) 为什么你的代码制造新的整数对象会伤害你?您是否有一个概要文件结果要共享,以证明生成过多整数会降低您的速度?一般来说,对象池是个坏主

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

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


如何扩大范围?

我想问你的问题是:

1) 为什么你的代码制造新的整数对象会伤害你?您是否有一个概要文件结果要共享,以证明生成过多整数会降低您的速度?一般来说,对象池是个坏主意。你需要一个好的理由来证明这一点

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);
}
私有静态类整型缓存
{
私有整数缓存(){}
静态最终整数缓存[]=新整数[-128)+127+1];
静止的
{
for(int i=0;i如果(i>=-128&&i您可以使用java.lang.Integer.IntegerCache.high属性来增加此缓存的大小。
例:

:

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


如果你分析了你的应用程序,发现创建整数对象是一个热点,那么无论如何,复制整数缓存代码并用不同的范围编写你自己的代码。否则你最好花时间找到真正的热点并改进它们。

显然,-XX:+AggressiveOpts将最大值设置为20000。请参阅上的答案

虽然您没有明确回答OP的问题,但我完全同意您的看法。将这些“廉价”对象集中在一起几乎肯定是个坏主意。
java -Djava.lang.Integer.IntegerCache.high=4096 SomeClass.class