为什么 Integer 类缓存值在 -128 到 127 范围内?

2024-02-05

关于我之前的问题,为什么 == 与 Integer.valueOf(String) 的比较对于 127 和 128 给出不同的结果? https://stackoverflow.com/questions/20877086/confusion-in-method-integer-valueofstring, 我们知道Integer class有一个缓存,用于存储之间的值-128 and 127.

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

Integer.valueOf() 文档 http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#valueOf(int)表示它"缓存经常请求的值"。但值是否介于-128 and 127经常被要求是真实的吗?我想经常要求的值非常主观。
这背后有什么可能的原因吗?

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


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

更大范围的整数may被缓存,但至少是 -128 到 127 之间的must被缓存,因为它是由Java语言规范 http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7(强调我的):

如果被装箱的值 p 是 true、false、一个字节或一个在 \u0000 到 \u007f 范围内的字符,或者-128 到 127(含)之间的整数或短数,然后令 r1 和 r2 为 p 的任意两次装箱转换的结果。 r1 == r2 的情况总是如此。

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

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

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


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

您可以使用-XX:AutoBoxCacheMaxJVM 选项,该选项并未真正记录在列表中可用的热点 JVM 选项 http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html。然而它在里面的评论Integer590号线附近的班级 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/lang/Integer.java#584:

缓存的大小可以由-XX:AutoBoxCacheMax=<size> option.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Integer 类缓存值在 -128 到 127 范围内? 的相关文章

随机推荐