从 Java 1.5 开始,您几乎可以在许多情况下Integer与之互换。int
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))
解决了这个问题。
任何人都可以解释为什么会这样吗?到目前为止,我只在我自己的 PC 上的本地主机上看到了这种行为。在这种特殊情况下,代码成功通过了大约 20 次比较,但在 2 次比较失败。该问题始终可以重现。
如果这是一个普遍存在的问题,它应该会导致我们的其他环境(开发和测试)出现错误,但到目前为止,在执行此代码片段的数百次测试之后,还没有人报告这个问题。
==使用比较两个Integer值仍然不合法吗?
==
JVM 正在缓存整数值。因此,与的比较==仅适用于 -128 和 127 之间的数字。
参考:#Immutable_Objects_.2F_Wrapper_Class_Caching