在编写图算法时,我看到了这个 -
定义:
Map<Integer, Integer> componentNames = new HashMap<Integer, Integer>();
案例I:
if (componentNames.get(A) == componentNames.get(B)) {
System.out.printn("Hi");
}
不打印任何内容。
案例II:
int componentNameA = componentNames.get(A);
int componentNameB = componentNames.get(B);
if (componentNameA == componentNameB) {
System.out.printn("Hi");
}
打印&#34;嗨&#34;
我已打印以检查值。而且,他们确实是一样的。 这是我第一次看到Java的奇怪行为。 这可能是什么原因?
答案 0 :(得分:3)
案例I:
if (componentNames.get(A) == componentNames.get(B)) { System.out.printn("Hi"); }
代码没有输入if条件,因为你试图使用Integer
比较两个==
引用,只有当LHS和RHS引用同一个对象时才会返回true。在您的情况下,可以安全地假设componentNames.get(A)
和componentNames.get(B)
都返回对单独的Integer
对象的引用。
知道JVM缓存包装类的值会很有帮助,如果JVM缓存了int
返回的componentNames.get(A)
值,则很可能上述if条件可能为真。和componentNames.get(B)
。 JVM用于缓存介于-128到127之间的Integer
值,但现代JVM也可以缓存大于此范围的值。
int componentNameA = componentNames.get(A); int componentNameB = componentNames.get(B); if (componentNameA == componentNameB) { System.out.printn("Hi"); }
代码进入条件是因为您将Integer
拆箱到int
并且比较是在两个原始值之间完成的。
通常,使用==
进行比较时,两个引用只有在两个引用都指向同一个对象时才返回true。因此,如果要检查相等性,建议使用equals
比较两个引用,如果要查看身份,则使用==
进行比较。
答案 1 :(得分:-1)
案例1:
componentNames.get(A)
和componentNames.get(B)
是两个不同Integer
类实例的引用/指针。
因此,componentNames.get(A) == componentNames.get(B)
为false
。
案例2:
int componentNameA
和int componentNameB
是int
类型变量。
由于它们都包含相同的值,componentNameA == componentNameB
为true.