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 componentNameA
和 int componentNameB
是 int
类型 变量 。
因为它们都包含相同的值,所以 componentNameA == componentNameB
是 true.
在写图算法的时候,看到了这个-
定义:
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 componentNameA
和 int componentNameB
是 int
类型 变量 。
因为它们都包含相同的值,所以 componentNameA == componentNameB
是 true.