首页 > Java > java教程 > Java 整数比较:什么时候应该使用 `==` 和 `equals()`?

Java 整数比较:什么时候应该使用 `==` 和 `equals()`?

Barbara Streisand
发布: 2024-12-26 18:03:11
原创
456 人浏览过

Java Integer Comparison: When Should I Use `==` vs. `equals()`?

Java 中的整数比较难题:== 与 equals()

在 Java 1.5 及更高版本中,整数可以被视为原始 int在许多场景中的值。然而,最近的一个代码问题引发了关于使用 == 运算符进行整数比较的有效性的问题。

问题陈述

考虑以下代码片段:

Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
    mismatch = true;
登录后复制

当 cdiCt 和 cdsCt 的值相等时,此代码似乎将不匹配设置为 true。在检查布尔表达式时,问题变得很明显:当值确实相等时,它的计算结果为 false,但当继续执行时,不知何故,不匹配仍然设置为 true。

解决方案

解决这个问题的方法是使用 equals() 方法相反:

if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
登录后复制

说明

== 运算符比较两个对象的内存引用,而 equals() 方法比较它们的值。对于像 int 这样的基本类型, == 运算符按预期工作。但是,对于像 Integer 这样的对象,== 运算符仅检查引用是否指向相同的缓存值。

出于性能原因,JVM 缓存 -128 到 127 之间的 Integer 值。因此,当使用 == 比较两个整数时,仅当两个值都在此范围内时,该运算符才会返回 true。在给定的场景中,这些值可能超出此范围,从而导致意外行为。

结论

虽然使用 == 比较基元是可以接受的,但它建议使用 equals() 方法来比较包装对象,例如 Integer。无论涉及的值如何,这都可以确保行为一致。

其他资源

  • [不可变对象/包装类缓存](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Integer.html#Immutable_Objects_.2F_Wrapper_Class_Caching)
  • [为什么可以编译器/JVM 不只是让自动装箱“只是工作”?](https://stackoverflow.com/questions/12595136/why-cant-the-compiler-jvm-just-make-autoboxing-just-work)

以上是Java 整数比较:什么时候应该使用 `==` 和 `equals()`?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板