相同的 hashCode 但 HashMap 中有两个不同的条目

Same hashCode but two different entries in HashMap

我所知道的是:在 HashMap 中插入元素时,Java 检查 hashCode 的值并将该元素插入到 HashMap 中,而在从 HashMap 中检索对象时,Java 检查值HashCode 并检索具有从该 HashCode 生成的值的对象。这是正确的吗?

我创建了一个模式来覆盖 HashCode 的默认实现。每次调用该模式时,它都会返回相同的值。那么,如果我们一次又一次地添加那个模态,为什么 HashMap 中的条目会增加?

这是我的代码:

模态:

 public class MyModal {
  int empId;
 String empName;

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    MyModal myModal = (MyModal) o;

    if (empId != myModal.empId) return false;
    if (empName != null ? !empName.equals(myModal.empName) : myModal.empName != null) return false;

    return true;
}

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

public MyModal(int empId, String empName) {
    this.empId = empId;
    this.empName = empName;
}
}

public class TestHashCode {
public static void main(String[] args) {
    HashMap<MyModal, Integer> hashMap = new HashMap<>();

    MyModal modal1 = new MyModal(1, "a");
    MyModal modal2 = new MyModal(2, "b");

    hashMap.put(modal1, 1);
    hashMap.put(modal2, 2);

    System.out.println("Size is" + hashMap.size());
    System.out.println(modal1.hashCode() + " "+modal2.hashCode());
}
}

输出:

Size is2
1 1

哈希冲突不是 map 构造中的唯一限制因素,但是返回常量 1 是一个 "worst" case Map,它的行为类似于 LinkedList(每个元素都在一个桶中).来自 Object.hashCode() Javadoc

It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hash tables.

HashCode和Equals都需要实现。哈希码用于缩小搜索范围,在 equals 中需要实现定义相等性。两个不相等的对象可以具有相同的哈希码,但并不意味着它们相等。

http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()