从Java1.5开始,在许多情况下,几乎可以将Integerint交换.

然而,我在代码中发现了一个潜在的缺陷,这让我有点吃惊.

以下代码:

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”?

推荐答案

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

参考:#Immutable_Objects_.2F_Wrapper_Class_Caching

Java相关问答推荐

那么比较似乎不是词典学的,尽管doctor 这么说

使用java访问具体子类特定方法的最佳方法是什么?

为什么BasicComboBoxRenderer在文本不存在或文本为空的情况下设置两次文本?

测试期间未执行开放重写方法

有没有更快的方法在N个容器中删除重复项?

Javadoc在方法摘要中省略方法

如何在antlr4中跳过所有反斜杠-换行符而保留换行符?

为什么当我创建Robot对象时,JavaFX引发IlLegalStateException异常?

如何在JavaFX循环中完美地制作一个AudioClip/MediaPlayer?

如何在Spring Boot中创建可以将值传递给配置的&Enable&Quot;注释?

如果List是一个抽象接口,那么Collectors.toList()如何处理流呢?

JavaFX:无论何时显示应用程序,如何更改组件/ node 位置?

视图被推出线性布局-Android

在缺少字段时使用Jackson With Options生成Optional.Empty()

Java嵌套流查找任意值

无法在IntStream上应用Collectors.groupingBy

在JPanel上使用GridBagLayout并将JButton放在里面时出现问题

找不到 jar 文件系统提供程序try 使用 jdeps 和 jlink 创建收缩 Java 映像来运行 Minecraft

如何在Java中立即显示ProgressBar对话框?

为什么方法接受协变类型的匿名泛型类对象?