为什么整数类缓存 -128 到 127 范围内的值?

2022-08-31 12:07:29

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

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

Integer.valueOf() 文档指出它缓存经常请求的值”。但是,是否经常请求介于 和 之间的值为实值?我认为经常请求的值是非常主观的。
这背后有什么可能的原因吗?-128127

从文件中还说:..并可能缓存此范围之外的其他值
如何实现这一点?


答案 1

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

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

如果被装箱的值 p 是真、假、字节或介于 \u0000 和 \u007f 之间的字符,或者介于 -128 和 127(含)之间的整数或短数字,则设 r1 和 r2 是 p 的任意两次装箱转换的结果。总是 r1 == r2。

同一段解释了这一要求的理由:

理想情况下,对给定的基元值 p 进行装箱,将始终产生相同的引用。在实践中,使用现有的实现技术可能不可行。上述规则是务实的妥协。上面的最后一个子句要求始终将某些公共值装箱到无法区分的对象中。[...]

这可确保在大多数情况下,行为将是所需的行为,而不会造成不适当的性能损失,尤其是在小型设备上。例如,内存限制较少的实现可能会缓存所有 char 和 short 值,以及 -32K 到 +32K 范围内的 int 和 long 值。


如何缓存此范围之外的其他值?

您可以使用 JVM 选项,该选项在可用热点 JVM 选项列表中并未真正记录。但是,在第 590 行周围的 Integer 类内部的注释中提到了它:-XX:AutoBoxCacheMax

缓存的大小可以由该选项控制。-XX:AutoBoxCacheMax=<size>

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


答案 2

-128 到 127 是默认大小。但javadoc还表示,Integer缓存的大小可能由该选项控制。请注意,它仅设置高值,低值始终为 -128。此功能在 1.6 中引入。-XX:AutoBoxCacheMax=<size>

至于为什么-128到127 - 这是字节值范围,很自然地将其用于非常小的缓存。