📜  Java中的 equals() 和 hashCode() 方法(1)

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

Java中的 equals() 和 hashCode() 方法

Java中的 equals() 和 hashCode() 方法是用于在比较和哈希Java中的对象时使用的方法。理解它们的作用和正确的实现对于编写高质量、高效的Java代码非常重要。

equals() 方法

Java中的equals()方法是用于比较两个对象是否相等的方法。在Java中,所有类都继承了Object类,并且Object类中的equals()方法是用于比较对象的引用的,也就是判断两个对象是否指向同一个内存地址。

public boolean equals(Object obj)

为了比较对象的内容而不是引用,我们需要在我们的类中覆盖equals()方法。我们可以根据对象的特定属性来编写自己的equals()方法,例如:

public class Person {
    private String firstName;
    private String lastName;
    private int age;

    // 此处省略构造函数和其他方法

    @Override
    public boolean equals(Object o) {
        if (o == this) return true;
        if (!(o instanceof Person)) return false;
        Person p = (Person) o;
        return p.firstName.equals(firstName) && 
               p.lastName.equals(lastName) && 
               p.age == age;
    }
}

在这个例子中,我们比较了三个属性来确定两个Person对象是否相等。

注意:equals()方法必须具有以下特征:

  • 自反性:x.equals(x)必须返回true
  • 对称性:x.equals(y)与y.equals(x)的结果必须相等
  • 传递性:如果x.equals(y)返回true,y.equals(z)也必须返回true,那么x.equals(z)也必须返回true
  • 一致性:如果对象没有被改变,无论调用多少次equals()方法,其结果必须相等。
  • 非空性:x.equals(null)必须返回false
hashCode()方法

hashCode()方法是用于计算对象的哈希码的方法。哈希码用于存储对象,以便我们在需要时可以快速进行查找。

public int hashCode()

Java中的哈希码计算方法很简单,通常使用对象的地址来计算。然而,在Java中,我们覆盖了equals()方法之后,需要在我们的类中提供我们自己的hashCode()实现。

通常,我们只需要使用对象的特定属性来计算哈希码,例如:

public class Person {
    private String firstName;
    private String lastName;
    private int age;

    // 此处省略构造函数和其他方法

    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + firstName.hashCode();
        result = 31 * result + lastName.hashCode();
        result = 31 * result + age;
        return result;
    }
}

在这个例子中,我们使用了一个常见的计算哈希码的方法。我们初始化一个result变量为一个质数,然后将每个属性的哈希码计算到result中。

注意:hashCode()方法必须具有以下特征:

  • 如果两个对象相等,则它们的哈希码必须相等。
  • 如果两个对象不相等,则它们的哈希码可以不相等。然而,为了获得更好的性能,哈希码应尽可能分散。
总结

equals() 和 hashCode()方法是Java中非常重要的方法,我们可以通过它们来比较和哈希对象。我们需要正确地实现这些方法,以便在代码中正确地使用它们。了解这些方法的特征和如何实现它们对于编写高质量的Java代码非常重要。