Java:整数等于vs.==

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不能让自动装箱“只工作”呢?


拉丁的传说
浏览 492回答 3
3回答

撒科打诨

你不能把两个Integer用一个简单的==它们是对象,所以大多数情况下引用将不一样。有个诡计Integer在-128和127之间,引用将与自动装箱用法相同。Integer.valueOf()缓存小整数。如果被装箱的值p为真、假、字节、\u0000至\u007f范围内的一个字符、或-128至127之间的int或短数,则让r1和r2是p两个装箱转换的结果。r1=r2的情况总是如此。资源:JLS-拳击关于同一主题:自动装箱与手动装箱java

呼如林

问题是,您的两个Integer对象就是对象。它们不匹配,因为您正在比较两个对象引用,而不是内部的值。显然.equals重写以提供值比较,而不是对象引用比较。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java