Java 地图价值平等

Java Map Value Equality

在写图算法的时候,看到了这个-

定义:

Map<Integer, Integer> componentNames = new HashMap<Integer, Integer>();

案例一:

if (componentNames.get(A) == componentNames.get(B)) {
    System.out.printn("Hi");
}

不打印任何东西。

案例二:

int componentNameA = componentNames.get(A);
int componentNameB = componentNames.get(B);
if (componentNameA == componentNameB) {
    System.out.printn("Hi");
}

打印 "Hi"

我已经打印出来检查值了。而且,他们确实是一样的。 这是我第一次看到 Java 的奇怪行为。 这可能是什么原因?

CASE I:

if (componentNames.get(A) == componentNames.get(B)) {
    System.out.printn("Hi");
}

代码没有进入 if 条件,因为您正在尝试使用 == 比较两个 Integer 引用,如果 LHS 和 RHS 引用同一个对象。在您的情况下,可以安全地假设 componentNames.get(A)componentNames.get(B) 都是 return 对单独的 Integer 对象的引用。

了解 JVM 缓存包装器 类 的值会很有帮助,如果 JVM 缓存了 int 值 类,则上述 if 条件很可能为真=36=]由 componentNames.get(A)componentNames.get(B) 编辑。 JVM 用于缓存 Integer 介于 -128 到 127 之间的值,但现代 JVM 也可以缓存大于此范围的值。

int componentNameA = componentNames.get(A);
int componentNameB = componentNames.get(B);
if (componentNameA == componentNameB) {
    System.out.printn("Hi");
}

代码进入条件是因为您正在将 Integer 拆箱为 int 并且比较是在两个原始值之间完成的。

一般来说,如果两个引用都指向同一个对象,则使用 == 比较两个引用只有 return 为真。因此,如果您要检查是否相等,建议使用 equals 比较两个引用;如果您要检查同一性,则使用 == 比较它们。

案例 1:

componentNames.get(A)componentNames.get(B) 引用/指针 Integer Class 的两个不同实例。

所以,componentNames.get(A) == componentNames.get(B)false

案例 2:

int componentNameAint componentNameBint 类型 变量

因为它们都包含相同的值,所以 componentNameA == componentNameBtrue.