当Equals重写为始终返回False时,HashMap和Hashtable的不同行为

时间:2016-02-05 13:42:32

标签: java

我很困惑,因为我认为当涉及hashCode和equals方法时,HashMap和Hashtable应该表现相同。在下面的这个例子中,我的密钥类重写了equals方法,总是返回false。

任何人都有任何想法可以解释这种行为上的差异,因为看起来两者的输出都不同

值null

值null

价值值1

价值2

import java.util.Hashtable;
import java.util.HashMap;

public class HashTest {

    public static void main(String[] args) {

        Hashtable ht = new Hashtable();
        HashMap hm = new HashMap();
        KeyClass k1 = new KeyClass("k1");
        KeyClass k2 = new KeyClass("k2");

        ht.put(k1, "Value 1");
        ht.put(k2, "Value 2");
        hm.put(k1, "Value 1");
        hm.put(k2, "Value 2");

        System.out.println("value " + ht.get(k1));
        System.out.println("value " + ht.get(k2));

        System.out.println("value " + hm.get(k1));
        System.out.println("value " + hm.get(k2));
    }
}

class KeyClass {
    String key;

    public KeyClass(String str) {
        key = str;
    }

    @Override
    public int hashCode() {
        return 2;
    }

    @Override
    public boolean equals(Object obj) {
        return false;
    }
}

2 个答案:

答案 0 :(得分:7)

这是因为HashMap首先在等式检查中使用==

public V get(Object key) {
   //...
   if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
      return e.value;

因此,尽管equals()返回false,但同一个对象被视为相同的密钥。

答案 1 :(得分:0)

在平等中返回总是错误不是一个好主意。根据定义,equals应该是反身的:

  

它是自反的:对于任何非空引用值x,x.equals(x)   应该回归真实。

对于哈希表将返回null,因为它在哈希码相等时使用equals而哈希映射将首先检查==对于对象