一尘不染

Java为什么整数类的缓存值在-128到127之间?

java

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

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

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

从文档中还指出:“ ..并且可能会缓存此范围之外的其他值。 ”
如何实现?


阅读 785

收藏
2020-03-01

共1个答案

一尘不染

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

可能会缓存更大范围的整数,但是至少必须缓存-128到127之间的整数,因为它是Java语言规范(强调我的)所要求的:

如果装箱的值p为true,false,字节或\ u0000到\ u007f范围内的char 或-128至127(含)之间的int或short数字,则令r1和r2为以下结果p的任何两次拳击转换。r1 == r2总是这样。

在同一段中解释了此要求的基本原理:

理想情况下,给定原始值p装箱将始终产生相同的参考。实际上,使用现有的实现技术可能不可行。以上规则是一种务实的妥协。上面的最后一个子句要求始终将某些通用值装在无法区分的对象中。[…]

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

如何缓存超出此范围的其他值?

你可以使用-XX:AutoBoxCacheMaxJVM选项,但未在可用的Hotspot JVM Options列表中真正进行记录。但是,它在第Integer590行附近的类中的注释中提到:

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

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

2020-03-01