从Java1.5开始,在许多情况下,几乎可以将Integer
与int
交换.
然而,我在代码中发现了一个潜在的缺陷,这让我有点吃惊.
以下代码:
Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
mismatch = true;
当两个值相等时,似乎设置不正确,尽管我不能确定在什么情况下.我在Eclipse中设置了一个断点,发现Integer
个值都是137,我判断了布尔表达式,它说它是假的,但是当我跨过它时,它将不匹配设置为真.
将条件更改为:
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
解决了这个问题.
有人能解释一下为什么会这样吗?到目前为止,我只在我自己的电脑上看到了localhost上的行为.在这个特定的例子中,代码成功地通过了大约20次比较,但在2次比较中失败.这个问题始终是可以重现的.
如果这是一个普遍存在的问题,那么它应该会在我们的其他环境(开发和测试)上导致错误,但到目前为止,在执行了数百个代码片段的测试之后,还没有人报告这个问题.
用==
来比较两个Integer
值仍然是不合法的吗?
除了下面所有的好答案之外,下面的stackoverflow链接还有很多附加信息.它实际上可以回答我最初的问题,但因为我的问题中没有提到自动装箱,所以它没有出现在所选的建议中:
Why can't the compiler/JVM just make autoboxing “just work”?