hashCode()和equals()覆盖实际上如何工作?

时间:2017-06-19 10:49:34

标签: equals hashcode override

我刚从一本书中读到并说它只要我们从Object类覆盖equals()方法,它的hashCode()方法也应该被覆盖,但我不明白为什么我们必须覆盖hashCode()方法。我们来看下面的例子:

public class Employee {
    public int employeeId;
    public String firstName, lastName;
    public int yearStarted;

    Employee(){}

    Employee(int employeeID){
        this.employeeId = employeeID;
    }

//  @Override
//  public int hashCode() {
//      return employeeId;
//  }

    public boolean equals(Object e) {
         if(!(e instanceof Employee)){
             return false;
         }
         else {
             Employee newEmp = (Employee)e;
             return this.employeeId == newEmp.employeeId;
         }

    }

    public static void main(String[] args) {
        Employee one = new Employee(101);
        if (one.equals(new Employee(101)))
            System.out.println("Success");
        else
            System.out.println("Failure");
    }
}

运行时,我得到“成功”结果,而我只覆盖equals(),但不覆盖hashCode()。那么当覆盖hashCode()方法实际上看起来与equals()相关的流程是什么样的,在哪种情况下我们需要覆盖hashCode()equals()?谢谢!

1 个答案:

答案 0 :(得分:0)

覆盖equals()hashCode()是一种惯例。原因是许多库实用程序(例如HashMap)依赖于两种方法的一致性。事实上,对于两个对象ab,如果a.equals(b)true,则a.hashCode() == b.hashCode()也应为true

您可能希望阅读有关基于哈希的数据结构以更详细地了解此要求,例如:https://en.wikipedia.org/wiki/Hash_table