equal 方法是一个用于比较两个对象是否相等的方法。这个方法一般用于比较基本数据类型和对象。在 Java 中, 方法被定义在 类中,因此所有 Java 中的类都继承了这个方法。 方法的默认行为是比较对象的内存地址是否相等。如果两个对象引用相同的内存地址,则它们是相等的。

如果要在自定义类中使用方法,需要重写类中的方法,并实现自己的对象比较逻辑。通常情况下,在自定义类中比较两个对象是否相等需要比较对象的属性是否相等。 比较的方式可以是比较属性一一对应是否相等,也可以是比较对象的哈希值是否相等。

下面是一个比较两个 Student 类对象是否相等的示例代码:

public class Student {
    private int id;
    private String name;

    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) return false;
        if (obj == this) return true;
        if (!(obj instanceof Student)) return false;
        Student otherStudent = (Student) obj;
        return this.id == otherStudent.id && this.name.equals(otherStudent.name);
    }

    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + id;
        result = 31 * result + (name != null ? name.hashCode() : 0);
        return result;
    }
}

在上面的示例中,我们重写了 方法来比较两个 对象。在 方法中,我们首先检查传入的对象是否为 、是否与当前对象引用同一内存地址,以及传入对象的类型是否是 类型。如果都为 ,则将传入对象中的参数与当前对象中的参数相比较,如果两者都相等,则返回 ,否则返回 。

为了确保 方法的正确使用,还需要同时重写 方法。 用于生成对象的哈希码,可以用于在集合类中对对象进行快速查找和比较。如果两个对象的哈希码相等,就可能生成冲突,需要再执行 方法进行比较。所以两个方法的正确实现是一起考虑和实现的。在上面的示例中,我们在 方法中对 和 进行哈希编码,以确保在比较两个 对象时可以正常工作。

值得提醒的是,在使用方法比较null引用时,仅会比较地址值是否相等,会返回false。而Apache Commons中的ObjectUtils 工具类中有一个方法可以避免null引用的比较问题。