当前位置: 首页 > 面试题库 >

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

晋鹤轩
2023-03-14
问题内容

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

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

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

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


问题答案:

只是想知道,为什么在-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上可能可用或不可用。



 类似资料:
  • 只是想知道,为什么在-128到127之间? Integer.valueOf()文档说明它“缓存频繁请求的值”。但是和之间的值是否经常被请求为真实值?我认为经常要求的价值是非常主观的。 这背后有没有可能的原因? 从文档中还说明:“..并可能缓存此范围之外的其他值。” 如何实现?

  • 问题内容: 输出: 输出: 注意:-128至127之间的数字为真。 问题答案: 当你使用Java编译数字文字并将其分配给Integer(大写)时,编译器将发出: 当你使用自动装箱时,也会生成此行代码。 valueOf 实现了“合并”某些数字,对于小于128的值,它将返回相同的实例。 从Java 1.6源代码的第621行: high可以使用system属性将的值配置为另一个值。 如果使用该系统属性运

  • 我无法理解整数的Java常量池是如何工作的。 我理解字符串的行为,因此能够证明整数常量也是同样的情况。 因此,对于整数 (&A) 直到现在一切都在我脑海中浮现。 我不能理解的是,当我从127增加整数时,它的行为不同。此行为在127之后发生变化,下面是代码片段 有人能帮我理解一下吗?

  • 问题内容: 我想使用条件比较两个 Long 对象的值。当这些值 小于128时 ,条件将正常工作,但是当这些 值大于或等于128时 ,比较将失败。 例: 上面代码的比较正常进行,但是下面代码失败: 为什么将 Long 变量与 大于127的 值进行比较会出现问题?如果将变量数据类型更改为 长原语 ,则比较适用于所有情况。 问题答案: TL; DR Java将装箱的Integer实例从缓存到。由于您用于

  • 问题内容: 近,我看到一个演示,其中包含以下Java代码示例: 现在我有些困惑。我知道为什么在第一种情况下结果为“假”-这是因为整数是引用类型,而“ a”和“ b”的引用是不同的。 但是,为什么在第二种情况下结果为“ true”? 我听到一种意见,出于某些优化目的,JVM将对象的int值从-128缓存到127。这样,“ c”和“ d”的引用是相同的。 有人可以给我更多有关此行为的信息吗?我想了解此