小编典典

Java:整数等于 vs. ==

all

从 Java 1.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))

解决了这个问题。

任何人都可以解释为什么会这样吗?到目前为止,我只在我自己的 PC 上的本地主机上看到了这种行为。在这种特殊情况下,代码成功通过了大约 20 次比较,但在 2
次比较失败。该问题始终可以重现。

如果这是一个普遍存在的问题,它应该会导致我们的其他环境(开发和测试)出现错误,但到目前为止,在执行此代码片段的数百次测试之后,还没有人报告这个问题。

==使用比较两个Integer值仍然不合法吗?


阅读 65

收藏
2022-07-29

共1个答案

小编典典

JVM 正在缓存整数值。因此,与的比较==仅适用于 -128 和 127 之间的数字。

参考:#Immutable_Objects_.2F_Wrapper_Class_Caching

2022-07-29