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

abh*_*jit 3 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*you 7

这是因为HashMap首次使用==等式检查:

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

因此,尽管equals()返回false,但同一对象被视为相同的键.

  • 并且你违反了`equals()的[reflexivity](http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang.Object-)要求. (2认同)