从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相关问答推荐

如何更改已在数据库中注册的 id 列类型

Java Streams - 分组并返回嵌套映射

@Query Java Spring Boot

任务':app:compileDebugJavaWithJavac'失败

应用程序构建成功,但 IntelliJ 说我的模块没有读取其他模块

我如何使用 Dockerfile 将 Maven 依赖项存储在 Docker 映像中

如何计算 Arraylist 中的每个唯一项?

如何在 Java 中格式化两个 LocalDate 变量的范围?

为什么打印停止而没有错误?

迭代可迭代对象直到满足条件或可迭代对象已在 Java 中完全迭代的最佳实践

TreeSet 正在向 Set 添加重复值

带有可变参数的消费者

java.util.Base64.getDecoder().decode 和 org.asynchttpclient.util.Base64.decode 有什么区别?

Ehcache 2 Maven依赖

打印所有可以使用 `+` 或 `-` 运算符给出给定数字的组合

如何用填充零计算整数

使用溢出和循环在 C 中查找最大值

Java中的重复输出

java中如何避免多个if

在使用 Javax webtarget 客户端发送 HTTPS 请求时,如何避免对包含“:[”的查询参数进行编码?