Java 中 equals 和 hashCode 的区别

122 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 12 天,点击查看活动详情

和方法是在类中定义的 Java 中两个通常被重写的equals方法。这些方法分别用于比较对象是否相等,以及为对象生成唯一标识符。hashCode``Object

equals方法用于根据两个对象的状态和类型来确定它们是否相等。默认情况下,该equals方法检查两个对象是否是同一个实例,这意味着它们实际上是内存中的同一个对象。但是,当您覆盖该equals方法时,您可以定义自己的标准来确定两个对象是否相等。

equals以下是您可以如何覆盖自定义 Java 类中的方法的示例:

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


    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }


    public int getAge() {
        return age;
    }


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
               name.equals(person.name);
    }
}

在此示例中,该类Person定义了一个自定义equals方法,用于检查两个Person对象是否具有相同的名称和年龄。这是确定两个对象是否相等的常用方法,它允许您使用运算符或方法比较Person对象。==``.equals()

另一方面,该hashCode方法用于为对象生成唯一标识符。此标识符称为“哈希码”,是从对象的状态和类型派生的数值。hashCodeJava 的内置数据结构(例如HashMap和 )使用该方法HashSet来有效地存储和检索对象。

hashCode以下是您可以如何覆盖自定义 Java 类中的方法的示例:

public class Person {  
private String name;  
private int age;  
  
  
public Person(String name, int age) {  
this.name = name;  
this.age = age;  
}  
  
  
public String getName() {  
return name;  
}  
  
public int getAge() {  
return age;  
}  
  
@Override  
public boolean equals(Object o) {  
if (this == o) return true;  
if (o == null || getClass() != o.getClass()) return false;  
Person person = (Person) o;  
return age == person.age &&  
name.equals(person.name);  
}  
  
@Override  
public int hashCode() {  
return Objects.hash(name, age);  
}  
}

在此示例中,该hashCode方法被重写以生成从对象的name和字段派生的哈希码。该方法用于将和字段的哈希码组合成单个哈希码。这确保了具有相同名称和年龄的两个对象将具有相同的哈希码,这对于在 或 之类的数据结构中高效存储和检索对象非常重要。age``Person``Objects.hash``name``age``Person``HashMap``HashSet

需要注意的是,重写equals方法的时候,也要重写hashCode方法。这是因为hashCode方法必须与方法一致equals,也就是说根据equals方法相等的两个对象必须具有相同的哈希码。如果您不重写该hashCode方法,则使用哈希码的数据结构可能无法正确存储和检索您的对象。

总之,方法equalshashCode方法是Java中用于比较和识别对象的重要方法。该equals方法用于判断两个对象是否相等,该hashCode方法用于为一个对象生成唯一标识。当您在自己的自定义类中重写这些方法时,重要的是始终如一且正确地这样做,以确保您的对象按预期运行。