hashcode hashmap和equals

时间:2015-01-03 06:19:36

标签: hashmap hashcode

我在哪里出错是遵循理解?

情景1:

Float[] f1= new Float[2];
Float[] f2= new Float[2];
System.out.println("Values"+f1[0]+","+f2[0]+","+(f1==f2));

输出:0.0,0.0,假。

我从中理解的是:

1)每当我们声明一个float类型数组时,所有的值都被初始化为0.0

2)虽然f1和f2都有相同的值,但它们指向Heap中的不同地址。

3)Object Class中的.equals()比较head中值的地址和值。

    HashMap<String, Integer> hashMap = new HashMap();
    String str1 = new String("test");
    String str2 = new String("test");
    System.out.println((str1==str2));
    System.out.println((str1.hashCode()==str2.hashCode()));

    hashMap.put(str1,1);
    hashMap.put(str2,2);
    System.out.println(hashMap.get(str1));

输出:假 真正 2

场景2

我从中理解的是 1)两个不可变的字符串文字&#34; test&#34;被创造了。它们都指向内存中的不同位置

2)从Oracle Docs中,如果equals返回的值相同,则返回的hashcode值必须相同,反之亦然。因此,在第二输出中从等于方法的偏转是合理的(即,与hashValue相比较)。 在这种情况下hashCode如何在内部工作?不是比较地址吗?在这里,他们指向不同的位置,所以他们应该有不同的地址吗?

3)它们具有相同的hashCode,因此hashMap将str1的值替换为str2。

1 个答案:

答案 0 :(得分:0)

情景#1
1)每当我们声明一个浮点类型数组时,所有的值都被初始化为0.0
是的,这是真的

2)尽管f1和f2都具有相同的值,但它们指向Heap中的不同地址 是的,您正在比较堆中两个数组的引用。

3)Object Class中的.equals()比较head中值的地址和值 是和上面#2的答案相同。它比较了两个对象的引用。

情景#2
1)两个不可变的字符串文字&#34; test&#34;被创造了。它们都指向存储器中的不同位置 是的,这是真的。

2)从Oracle Docs中,如果equals返回的值相同,则返回的hashcode值必须相同,反之亦然。因此,在第二输出中从等于方法的偏转是合理的(即,与hashValue相比较)。在这种情况下,hashCode如何在内部工作?不是比较地址吗?在这里,他们指向不同的位置,所以他们应该有不同的地址吗?

这就是hashCode方法在String上的工作方式:

public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;

        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}

3)它们具有相同的hashCode,因此hashMap将str1的值替换为str2 除了hashCode之外,它还会检查两个对象是否相等,如果两个条件都满足,那么它将覆盖相同的键的值。