📜  为什么要覆盖 equals(Object) 和 hashCode() 方法?(1)

📅  最后修改于: 2023-12-03 15:21:37.788000             🧑  作者: Mango

为什么要覆盖 equals(Object) 和 hashCode() 方法?

在 Java 中,Object 类是所有类的父类。它包含了一些非常基础的方法,其中包括 equals(Object)hashCode() 方法。但是,这两个方法可能无法满足我们实际的需要,因为它们默认的行为比较简单,可能不能正确地处理我们的数据类型。

为了解决这个问题,我们通常会覆盖 equals(Object)hashCode() 方法,以便它们能够正确地比较我们的对象,并在需要时正确地运行。

equals(Object)

equals() 方法是用于比较两个对象是否相等的方法。然而,默认情况下它仅仅是比较两个对象的引用是否相等,而非实际的属性值是否相等。因此,我们需要覆盖该方法,以确保比较的是对象的实际内容,而不只是引用。

在覆盖该方法时,我们通常需要考虑以下几个方面:

  • 首先判断是否为同一个对象。如果两个对象是同一个对象,则它们一定相等。
  • 其次,判断传入的对象是否为空。如果传入的对象为空,则一定不相等。
  • 最后,比较两个对象的属性值是否相等。这个比较过程需要分别比较每个属性值是否相等,在这一步就需要重写 equals() 方法,按照实际的需求进行判断。

以下是一个简单的示例:

public class Employee {
    private String name;
    private int age;

    // 构造方法,getter 和 setter 略去

    @Override
    public boolean equals(Object o) {
        if (o == this) {
            return true;
        }
        if (!(o instanceof Employee)) {
            return false;
        }
        Employee e = (Employee) o;
        return age == e.age && Objects.equals(name, e.name);
    }
}
hashCode()

hashCode() 方法用于返回对象的哈希码值。哈希码是一个整数,有以下两个特点:

  • 如果两个对象相等,则它们的哈希码必须相等。
  • 如果两个对象的哈希码相等,则它们不一定相等(也就是哈希冲突)。

在覆盖该方法时,我们同样需要考虑对象的实际内容,而不是默认的引用值。我们通常会重写 hashCode() 方法,以使用对象的属性计算一个综合的哈希值。

以下是一个示例:

public class Employee {
    private String name;
    private int age;

    // 构造方法,getter 和 setter 略去

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
总结

覆盖 equals(Object)hashCode() 方法能够确保对象被正确比较和哈希。使用默认的 Object 类实现会导致不正确的比较和哈希,因此它们不适用于大多数具体的对象类型。