如何使用java.util.Objects实现equals()和hashCode()方法?

本示例将向您展示如何使用类实现equals()andhashCode()对象java.util.Objects。的Objects类别提供一组实用的方法来工作,对象,如比较是否相等两个对象和计算的哈希码。其他方法包括对象null检查方法,对象到字符串方法等。

为了演示equals()和hash()方法,我们将创建一个简单的POJO Student,它具有id,name和等几个属性dateOfBirth。

package org.nhooo.example.util;

import java.time.LocalDate;
import java.util.Objects;

public class Student {
    private Long id;
    private String name;
    private LocalDate dateOfBirth;

    public Student() {
    }

    public Student(Long id, String name, LocalDate dateOfBirth) {
        this.id = id;
        this.name = name;
        this.dateOfBirth = dateOfBirth;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public LocalDate getDateOfBirth() {
        return dateOfBirth;
    }

    public void setDateOfBirth(LocalDate dateOfBirth) {
        this.dateOfBirth = dateOfBirth;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Student that = (Student) o;
        return Objects.equals(this.id, that.id)
            && Objects.equals(this.name, that.name)
            && Objects.equals(this.dateOfBirth, that.dateOfBirth);
    }

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

在类中使用Objects.equals()和Objects.hash()方法Student可使equals()方法和hashCode()方法的实现简洁,易于阅读和理解。该Objects实用类将在这意味着它会检查对象的空场空安全的方式进行操作。

下面的代码片段将演示Student类的用法。它将使用该equals()方法比较对象并打印出对象的计算出的哈希码。

package org.nhooo.example.util;

import java.time.LocalDate;
import java.time.Month;

public class EqualsHashCodeExample {
    public static void main(String[] args) {
        Student student1 = new Student(1L, "Alice", LocalDate.of(1990, Month.APRIL, 1));
        Student student2 = new Student(1L, "Alice", LocalDate.of(1990, Month.APRIL, 1));
        Student student3 = new Student(2L, "Bob", LocalDate.of(1992, Month.DECEMBER, 21));

        System.out.println("student1.equals(student2) = " + student1.equals(student2));
        System.out.println("student1.equals(student3) = " + student1.equals(student3));
        System.out.println("student1.hashCode() = " + student1.hashCode());
        System.out.println("student2.hashCode() = " + student2.hashCode());
        System.out.println("student3.hashCode() = " + student3.hashCode());
    }
}

这是上面代码片段的结果:

student1.equals(student2) = true
student1.equals(student3) = false
student1.hashCode() = 1967967937
student2.hashCode() = 1967967937
student3.hashCode() = 6188033

实现equals()andhashCode()方法的另一种方法是使用Apache Commons Lang库。它的示例可以在这里看到:如何使用Apache Commons实现hashCode和equals方法?