【发布时间】:2011-04-07 23:11:21
【问题描述】:
从 Java 1.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))
解决了问题。
谁能解释一下为什么会这样?到目前为止,我只在我自己的 PC 上的本地主机上看到了这种行为。在这种特殊情况下,代码成功通过了大约 20 次比较,但在 2 次比较失败。问题始终可以重现。
如果这是一个普遍存在的问题,它应该会在我们的其他环境(开发和测试)上导致错误,但到目前为止,在执行此代码 sn-p 的数百次测试之后,没有人报告此问题。
使用== 比较两个Integer 值仍然不合法吗?
除了下面所有的好答案之外,下面的 stackoverflow 链接还有很多额外的信息。它实际上会回答我原来的问题,但是因为我没有在我的问题中提到自动装箱,所以它没有出现在选定的建议中:
Why can't the compiler/JVM just make autoboxing “just work”?
【问题讨论】:
标签: java integer wrapper primitive equals-operator