java中重写equals和重写hashCode()

Java中的equals()方法用于比较两个对象是否是相同的,而hashCode()则用于给对象生成一个唯一的哈希值。在某些情况下,需要重写这两个方法来确保正确的对象比较和哈希码生成。

Java中的equals()方法用于比较两个对象是否是相同的,而hashCode()则用于给对象生成一个唯一的哈希值。在某些情况下,需要重写这两个方法来确保正确的对象比较和哈希码生成。

重写equals和hashCode()方法的原因

默认情况下,Java对象的equals()方法比较的是对象的引用。也就是说,只有当两个对象的引用指向同一个内存地址时,它们才被认为是相同的。但是在实际场景中,很多情况下需要比较的是对象的某些属性。例如,比较两个人是否是同一个人,应该比较的是它们的身份证号码,而不是它们在内存中的地址。

因此,我们需要重写equals()方法,以便在对象比较时比较它们的属性值而不是引用地址。而hashCode()方法与之配合使用,它生成的哈希值用于快速比较两个对象是否相等,从而提高了程序的性能。

重写equals()方法的步骤

  1. 判断两个对象是否引用同一个内存地址,是则返回true。
  2. 判断对象是否为null,是则返回false。
  3. 判断两个对象的类是否相同,如果不是则返回false。
  4. 将对象转换为相应的类类型,判断属性值是否相等,如果相等则返回true,否则返回false。

示例1

下面是一个Person类示例,其中重写了equals()方法:

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

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

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

在上面的例子中,equals()方法首先检查两个对象是否是同一个引用,如果是则返回true。然后检查传入的对象是否是Person类型,如果不是则返回false。最后比较两个对象的属性值,如果相等则返回true。

在HashCode()方法中,使用了Java 7新增的Objects.hashCode(Object…values)方法,它可以根据属性值来生成哈希码值。

重写hashCode()方法的步骤

hashCode()方法的重写要求同一个类的两个对象必须生成同样的哈希码值,如果生成不同的哈希值,那么在使用哈希表等数据结构时就会出现错误。

  1. 声明一个int类型的变量result,并将其初始化为初始值,例如17。
  2. 将对象的属性值和result组合成一个 hash code。
  3. 如果属性值为引用类型,递归调用它的hashCode()方法。
  4. 返回result。

示例2

下面是一个User类示例,其中重写了hashCode()方法:

public class User {
    private String username;
    private String password;

    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        if (!(obj instanceof User)) {
            return false;
        }
        User user = (User) obj;
        return this.username.equals(user.username) && this.password.equals(user.password);
    }

    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + username.hashCode();
        result = 31 * result + password.hashCode();
        return result;
    }
}

在上面的例子中,hashCode()方法中组合了username和password属性的哈希值,采用了经典的31倍数加法算法,这种算法能够避免生成相同的哈希值。

本文标题为:java中重写equals和重写hashCode()

基础教程推荐