首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展java Integer缓存

扩展java Integer缓存
EN

Stack Overflow用户
提问于 2010-10-14 22:34:49
回答 5查看 4.2K关注 0票数 3

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

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

如何扩展范围?

EN

回答 5

Stack Overflow用户

发布于 2010-10-15 01:03:47

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

例如:

java -Djava.lang.Integer.IntegerCache.high=4096 SomeClass.class

票数 12
EN

Stack Overflow用户

发布于 2010-10-14 22:39:04

我要问你的问题是:

1)为什么你的代码创建新的Integer对象会伤害你?你有没有要分享的分析结果,来证明做太多的整数会减慢你的速度?一般来说,对象池不是一个好主意。你需要一个很好的案例来证明它的合理性。

2)为什么要做new Integer(int)?如果你只是把它作为一个原始的int,你不仅可以避免“创建一个新的对象”。您根本不会创建任何对象。如果以后需要,自动装箱将处理将其转换为Integer。

*免责声明我也不使用..我编写对性能敏感的代码,但还没有达到手动将原始int转换为Integer的地步。只要有可能,我只会保留一个int类型,如果需要的话,让JVM自动装箱。

票数 2
EN

Stack Overflow用户

发布于 2010-10-14 22:50:00

扩展缓存的范围可能不会得到您想要的,但是如果您确实需要缓存更大的范围,您可以使用此代码而不是Integer.valueOf(int)。您只需将缓存范围值调整为您想要的范围。

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3934291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档