为了账号安全,请及时绑定邮箱和手机立即绑定

为什么Integer类缓存值在-128到127之间?

为什么Integer类缓存值在-128到127之间?

宝慕林4294392 2019-07-02 10:25:23
关于我之前的问题,为什么=与Integer.value eOf(String)的比较给出了127和128的不同结果?,我们知道Integer class有一个缓存,它将值存储在-128和127.只是好奇,为什么在-128至127之间?Integer.value eOf()文档说它"缓存频繁请求的值"..但两者之间的值-128和127经常被要求是真的吗?我以为频繁请求的值非常主观。这背后有什么可能的原因吗?文件中还指出:".并且可能缓存超出此范围的其他值。" 如何才能做到这一点?为什么Integer类缓存值在-128到127之间?
查看完整描述

3 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

只是好奇,为什么在-128到127之间?

更大范围的整数可以,可能被缓存,但至少在-128到127之间。被缓存,因为它是由Java语言规范(强调地雷):

如果正在装箱的值p为true、false、字节或在\u0000至\u007f范围内的字符,或在-128到127之间的整数或短数(含),设r1和r2是p的任意两个装箱转换的结果。通常情况下,r1=r2。

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

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

这确保了在大多数常见情况下,行为将是理想的行为,而不会造成不适当的性能惩罚,特别是在小型设备上。..例如,内存有限的实现可能会缓存所有字符和短值,以及在-32K到+32K范围内的int值和长值。


如何将其他值缓存在此范围之外。?

您可以使用-XX:AutoBoxCacheMax选项中没有真正记录的jvm选项。可用HotSpot JVM选项..然而,在内部的评论Integer第590行周围的:

缓存的大小可以由-XX:AutoBoxCacheMax=<size>选择。

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


查看完整回答
反对 回复 2019-07-02
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

-128至127是默认大小。但是javadoc还表示Integer缓存的大小可能是-XX:AutoBoxCacheMax=<size>选择。注意,它只设置高值,低值总是-128。这一特性是在1.6中引入的。

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


查看完整回答
反对 回复 2019-07-02
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

缓存小整数的原因,如果这是你要问的,是因为许多算法在计算中使用小整数,所以避免为这些值创建对象的开销是值得的。

然后问题就变成了要缓存哪些整数。再说一次,一般来说,常量值的使用频率会随着常数绝对值的增加而减少-每个人都花很多时间使用1或2或10,很少有人非常密集地使用值109;很少有人会有性能,这取决于一个人能以多快的速度获得一个722的整数。Java选择在有符号字节值的范围内分配256个槽。这一决定可能是通过对当时存在的程序进行分析得出的,但也有可能是完全武断的。这是一个合理的投资空间,它可以快速访问(屏蔽以确定值是否在缓存的范围内,然后快速查找表以访问缓存),而且它肯定涵盖了最常见的情况。

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


查看完整回答
反对 回复 2019-07-02
  • 3 回答
  • 0 关注
  • 2417 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号