当前位置: 首页 > 面试题库 >

JVM为什么允许为IntegerCache设置“高”值,而不是设置“低”值?

容寒
2023-03-14
问题内容

我们都知道Java在Integer[-128, 127]被认为是“常用” )范围内为数字缓存(以及一些其他类型)。

缓存的设计如下:

private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static final Integer cache[];

    static {
        // high value may be configured by property
        int h = 127;
        String integerCacheHighPropValue =
            sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if (integerCacheHighPropValue != null) {
            try {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            } catch( NumberFormatException nfe) {
                // If the property cannot be parsed into an int, ignore it.
            }
        }
        high = h;

        cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);

        // range [-128, 127] must be interned (JLS7 5.1.7)
        assert IntegerCache.high >= 127;
    }

    private IntegerCache() {}
}

我知道可以high通过为JVM提供参数来扩展值:

java -Djava.lang.Integer.IntegerCache.high=xxxx Aclass.class

我不明白的是为什么我们不允许覆盖该low值?

请注意,我并不是想找到一种解决方法,而是要理解为什么出于某些晦涩的原因而不允许这样做。


问题答案:

发现对此已经存在未解决的RFP。

乔·达西(Joe Darcy)对这个问题发表了评论:

可以想象也可以缓存更大范围的负数,这是有帮助的,但是到目前为止,还没有迫切需要这样做。

请注意,如果有人对RFP有兴趣在使用它之前对其进行处理,则RFP提供的解决方案很差:

除了实现自己的缓存并在转到java.lang.Integer类之前先执行此操作外,没有其他解决方法可以增加缓存的大小。
显然这不是很好,因为它要求调用其他类,而不仅仅是Integer.valueOf(int i)调用的默认用法



 类似资料:
  • 假设我们有一个具有简单集合(例如列表)的类。类包含一个构造函数、getter和setter。有人告诉我,直接设置集合是一种不好的做法。 有人能指出编写方法的缺点吗?

  • 问题内容: 我有两个文件domain.com/test2.php: 和domain.com/test3.php: 在这种情况下,domain.com/test2.php的输出 与您期望的一样,但是现在让我们说我想在一个子域中创建一个test2.php。为了阻止跨域脚本编写问题,我将在sub.domain.com/test2.php的开头添加以下额外的行: 此额外的行阻止了跨域错误的显示,但是现在该

  • 问题内容: 我将每个列都设置为,但是由于某种原因,我仍然能够在每个列中添加一个值。这是我的表信息(创建语法): 这是一个有效的示例: 有什么想法为什么会这样? 问题答案: 您要插入空字符串,而空字符串不是,要检查错误,请执行以下操作: 你会看到错误。该只对那些不值检查。 为了防止空字符串,您必须使用触发器,或者在执行查询之前对服务器端编程语言进行检查以将空字符串转换为。的示例触发器可能类似于:(这

  • 问题内容: 您发现运行Eclipse的最佳JVM设置是什么? 问题答案: Eclipse Helios 3.6和3.6.x设置 替代文字http://www.eclipse.org/home/promotions/friends-helios/helios.png 在对Eclipse Ganymede 3.4.x和Eclipse Galileo 3.5.x进行设置之后,下面是对Eclipse He

  • 问题内容: 我正在使用以下代码(尝试)查询数据库: 其中clientRequest [0]来自字符串数组,服务变量是POJO中的字符串,映射到MySQL数据库中的VARCHAR(45)。 当我运行此代码时,Hibernate将执行的SQL查询显示为: 这使我相信clientRequest [0]的值未正确设置为参数。 我检查了clientRequest [0]包含一个有效的String,它确实这样

  • 在Java9中,为、和接口引入了新的工厂方法。这些方法允许在一行中快速实例化具有值的Map对象。现在,如果我们考虑: 以上内容是允许的,没有任何例外,如果我们这样做: 我知道HashMap可以将null作为键和值,但为什么在Map.of的情况下会受到限制呢? 同样的情况也发生在和中。