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

为什么equal运算符对Integer值直到128数字有效?

金正阳
2023-03-14
问题内容

为什么Integer “ =”运算符不适用于128和Integer值之后的值?有人可以解释这种情况吗?

这是我的Java环境:Java版本“ 1.6.0_37”

Java(TM)SE运行时环境(内部版本1.6.0_37-b06)

Java HotSpot(TM)64位服务器VM(内部版本20.12-b01,混合模式)

样例代码:

    Integer a;
    Integer b;
    a = 129;
    b = 129;

    for (int i = 0; i < 200; i++) {
        a = i;
        b = i;

        if (a != b) {
            System.out.println("Value:"+ i + " - Different values");
        } else {
            System.out.println("Value"+ i + " Same values");
        }
    }

控制台输出的一部分:

Value:124 - Same values
Value:125 - Same values
Value:126 - Same values
Value:127 - Same values
Value:128 - Different values
Value:129 - Different values
Value:130 - Different values
Value:131 - Different values
Value:132 - Different values

谢谢!


问题答案:

查看Integer的源html" target="_blank">代码。你可以在那里看到值的缓存。

缓存仅在你使用时发生Integer.valueOf(int),而不是在使用时发生new Integer(int)。你使用的自动装箱Integer.valueOf

根据JLS,你始终可以相信,对于-128到127之间的值,自动装箱后你将获得相同的Integer对象,并且在某些实现中,即使对于更高的值,也可能会获得相同的对象。

实际上,在Java 7中(并且我认为在Java 6的较新版本中),IntegerCache类的实现已更改,并且上限不再进行硬编码,而是可以通过属性“ java.lang.Integer.IntegerCache进行配置”。高”,因此,如果使用VM参数运行程序,则-Djava.lang.Integer.IntegerCache.high=1000所有值都将获得“相同值”。

但是JLS仍然只保证直到127:

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

对于其他值,此公式不允许对程序员方面的带框值的身份进行任何假设。这将允许(但不要求)共享部分或全部这些引用。

这样可以确保在最常见的情况下,这种行为将是理想的行为,而不会造成不必要的性能损失,尤其是在小型设备上。例如,较少内存限制的实现可能会缓存所有字符和短裤以及-32K-+ 32K范围内的整数和长整数。



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

  • 问题内容: 我尝试使用Google搜索和堆栈溢出进行搜索,但未显示任何结果。我已经在开源库代码中看到了这一点: ”| =”()是什么意思? 问题答案: 的读取方式与相同。 是相同的 按位或运算符在哪里。 这里引用了所有运算符。 之所以使用按位运算符,是因为这些常量经常使int能够携带标志。 如果你查看这些常数,你会发现它们具有两个幂: 因此,你可以使用按位或来添加标志 所以 只是意味着我们添加了一

  • 问题内容: 为什么在Python中没有and运算符? 问题答案: 不是因为它没有道理;而是因为它没有意义。最好将“ x ++”定义为“ x + = 1,求出x的先前绑定”。 如果您想知道最初的原因,则必须浏览旧的Python邮件列表,或者询问那里的某个人(例如Guido),但是在事实成立之后就很容易找到理由了: 与其他语言一样,不需要简单的增量和减量。您不会经常用Python编写东西。相反,你做类

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

  • 我使用的是我的代码中有两个可观察的对象 观察值不是来自请求,而是来自 我需要根据这个逻辑将序列组合/转换成一个单一的可观察值: 如果序列,或,-需要返回新的可观察的否则需要返回 我试图使用来实现: 但问题是我的