Java:整数相等难题 - equals 与 ==
虽然整数及其相应的包装类 Integer 通常可以互换使用,使用相等运算符比较两个整数值时遇到了特殊行为(==).
意外结果
考虑以下代码片段:
Integer cdiCt = ...; Integer cdsCt = ...; ... if (cdiCt != null && cdsCt != null && cdiCt != cdsCt) mismatch = true;
令人惊讶的是,这个条件似乎错误地将不匹配设置为即使 cdiCt 和 cdsCt 的基础值相等(例如,都包含值 137)。
自动装箱问题
这种令人费解的行为背后的罪魁祸首在于 Java 的自动装箱机制。当将基元(例如 int)与其相应的包装类(例如 Integer)进行比较时,自动装箱会自动将基元转换为其包装对象。然而,这种转换引入了一个微妙的复杂性。
JVM 缓存
出于性能原因,JVM 缓存 -128 到 127 之间的 Integer 值。在此范围内,JVM 只会返回缓存的实例,而不是创建新实例。此缓存机制确保对同一原始值(在缓存范围内)的所有引用都指向同一个 Integer 实例。
== 比较失败
比较两个时整数对象使用相等运算符(==),Java 检查它们是否引用内存中的同一个对象。如果是,则比较返回 true;否则,比较结果为 true。否则,返回 false。但是,当比较两个都在缓存范围内且具有相同原始值的 Integer 对象时,它们将引用相同的缓存实例,从而导致 == 比较出现误报。
解决方案:使用 equals 方法
为了避免这个问题,建议在比较 Integer 对象时使用 equals 方法。 equals 方法执行基于值的比较,确保两个 Integer 对象仅在具有相同原始值时才被视为相等。
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt)) mismatch = true;
结论
而使用 == 比较缓存范围(-128 到 127)内的 Integer 对象可能看起来有效,但可能会导致意外结果。为了确保可靠的相等比较,请始终使用 equals 方法。
以上是Java 整数比较:为什么 `==` 有时会失败,什么时候应该使用 `.equals()`?的详细内容。更多信息请关注PHP中文网其他相关文章!