Java Map Value Equality

时间:2016-08-27 06:12:50

标签: java hashmap equality

在编写图算法时,我看到了这个 -

定义:

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的奇怪行为。 这可能是什么原因?

2 个答案:

答案 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 componentNameAint componentNameBint类型变量

由于它们都包含相同的值,componentNameA == componentNameBtrue.