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

Java:整数等于vs.==

Java:整数等于vs.==

拉丁的传说 2019-06-18 17:00:07
Java:整数等于vs.==从Java1.5开始,您几乎可以交换Integer带着int在很多情况下。但是,我在代码中发现了一个潜在的缺陷,这让我有点吃惊。以下代码:Integer cdiCt = ...;Integer cdsCt = ...;...if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)     mismatch = true;当值相等时,似乎不正确地设置不匹配,尽管我无法确定在什么情况下。我在Eclipse中设置了一个断点,并看到Integer值都是137,我检查了布尔表达式,它说它是假的,但当我跨过它时,它设置错配为true。将条件更改为:if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))解决了问题。有人能解释一下为什么会发生这种事吗?到目前为止,我只在我自己的个人电脑上看到了我的本地主机上的行为。在这种情况下,代码成功地通过了大约20次比较,但在2上失败了。如果这是一个普遍存在的问题,它应该会在我们的其他环境(dev和test)上造成错误,但是到目前为止,在执行这个代码片段的数百个测试之后,还没有人报告过这个问题。使用它还不合法吗?==比较两个Integer价值?除了下面所有的详细答案之外,下面的堆栈溢出链接还有相当多的附加信息。它本来可以回答我最初的问题,但由于我的问题中没有提到自动装箱,所以它没有出现在所选的建议中:为什么编译器/JVM不能让自动装箱“只工作”呢?
查看完整描述

3 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

你不能把两个Integer用一个简单的==它们是对象,所以大多数情况下引用将不一样。

有个诡计Integer在-128和127之间,引用将与自动装箱用法相同。Integer.valueOf()缓存小整数。

如果被装箱的值p为真、假、字节、\u0000至\u007f范围内的一个字符、或-128至127之间的int或短数,则让r1和r2是p两个装箱转换的结果。r1=r2的情况总是如此。


资源:

关于同一主题:


查看完整回答
反对 回复 2019-06-18
?
呼如林

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

问题是,您的两个Integer对象就是对象。它们不匹配,因为您正在比较两个对象引用,而不是内部的值。显然.equals重写以提供值比较,而不是对象引用比较。


查看完整回答
反对 回复 2019-06-18
  • 3 回答
  • 0 关注
  • 491 浏览

添加回答

举报

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