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

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

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

犯罪嫌疑人X 2019-11-02 13:27:00
为什么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 valuesValue:125 - Same valuesValue:126 - Same valuesValue:127 - Same valuesValue:128 - Different valuesValue:129 - Different valuesValue:130 - Different valuesValue:131 - Different valuesValue:132 - Different values谢谢!
查看完整描述

3 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

查看Integer的源代码。您可以在那里看到值的缓存。


缓存仅在您使用时发生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范围内的整数和长整数。


查看完整回答
反对 回复 2019-11-02
?
白衣非少年

TA贡献1155条经验 获得超0个赞

Integer是的包装器类int

Integer != Integer比较实际对象引用,int != int将在其中比较值。

如前所述,值-128到127被高速缓存,因此它们返回相同的对象。

如果超出该范围,将创建单独的对象,因此引用将不同。

要解决这个问题:

  • 进行类型int

  • 将类型强制转换为int

  • 采用 .equals()


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

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信