为什么Integer类的caching值在-128到127的范围内?

关于我以前的问题, 为什么==与Integer.valueOf(string)比较给127和128不同的结果? ,我们知道Integer class有一个caching,它存储-128127之间的值。

只是想知道,为什么在-128和127之间

Integer.valueOf()文档指出,它caching频繁请求的值 。 但是,真正需要-128127之间的值吗? 我认为经常要求的价值观是非常主观的。
这有什么可能的原因吗?

从文档还指出: ..并可能caching在此范围之外的其他值。
这是如何实现的?

只是想知道,为什么在-128和127之间?

可以caching更大范围的整数,但是至less在-128和127之间的那些必须被caching,因为它是由Java语言规范 (强调我的)规定的:

如果p的值是真,假,一个字节,或者范围在\ u0000到\ u00f 之间的一个字符,或者在-128到127之间的一个int或者一个短数字 ,那么让r1和r2是任何两个拳击转换的p。 r1 == r2总是如此。

这个要求的基本原理在同一段中解释:

理想情况下,装箱一个给定的原始值p,总会产生一个相同的参考 。 实际上,使用现有的实现技术可能是不可行的。 上面的规则是一个务实的妥协。 上面的最后一个条款要求某些常用值总是被装入不可区分的对象中。 […]

这确保了在大多数情况下,行为将是所期望的,而不施加不适当的性能损失,特别是在小型设备上 。 例如,内存限制较less的实现可能会caching所有char和short值,以及-32K到+ 32K范围内的int和long值。


我怎样才能caching这个范围之外的其他值?

您可以使用-XX:AutoBoxCacheMax JVM选项,该选项在可用的热点JVM选项列表中没有logging。 但是在590行围绕Integer类的注释中提到:

caching的大小可以通过-XX:AutoBoxCacheMax=<size>选项来控制。

请注意,这是特定于实现的,可能在其他JVM上可用,也可能不可用。

-128到127是默认大小。 但javadoc也说整数caching的大小可以通过-XX:AutoBoxCacheMax=<size>选项来控制。 注意它只设置高值,低值总是-128。 这个特性是在1.6中引入的。

至于为什么-128到127 – 这是字节值范围,很自然的用它来做一个非常小的caching。

caching小整数的原因,如果这就是你要求的,许多algorithm在他们的计算中使用小整数,所以避免这些值的对象创build开销往往是值得的。

这个问题就变成了要caching的整数。 同样,一般来说,常数值的使用频率随着常数的绝对值增加而减小 – 每个人花费大量时间使用值1或2或10,相对较less的几个使用值非常小集中; 有更less的性能取决于可以多快得到一个整数722 .. Javaselect分配256个插槽跨越有符号字节值的范围。 这个决定可能是通过分析当时存在的程序而得到的,但也可能是纯粹任意的。 这是一个合理的投资空间,它可以被快速访问(掩码来查看该值是否在caching的范围内,然后快速查表来访问caching),它肯定会覆盖最常见的情况。

换句话说,我认为你的问题的答案是“它不像你想象的那么主观,但是确切的界限在很大程度上是一个经验法则的决定……并且经validation据表明它已经足够好了。 “

可以caching的最大高整数值可以通过系统属性configuration,即java.lang.Integer.IntegerCache.high-XX:AutoBoxCacheMax )。 caching是使用数组实现的。

  private static class IntegerCache { static final int high; static final Integer cache[]; static { final int low = -128; // high value may be configured by property int h = 127; if (integerCacheHighPropValue != null) { // Use Long.decode here to avoid invoking methods that // require Integer's autoboxing cache to be initialized int i = Long.decode(integerCacheHighPropValue).intValue(); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - -low); } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); } private IntegerCache() {} }