您的位置:

Java中equals方法的使用

介绍

equals方法是Java中常用的方法之一。它被用来比较对象是否相等。在Java中,对象的相等是指在逻辑上相等,而不是在物理位置上相等。这意味着,如果两个对象在逻辑上相等,尽管它们在堆内存中的物理位置不同,equals方法也会返回true。

在Java中,equals方法是从java.lang.Object类继承而来的。因为所有的Java类都从Object类派生出来,所以如果一个类没有重写Object类的equals方法,那么它将继承Object类中定义的equals方法。

正文

1. equals方法介绍

在Java中,equals方法可以用来比较对象是否相等。默认情况下,Object类中的equals方法是比较对象的引用是否相等,即是否指向同一对象。如果你想改变这个默认行为,就必须在你的类中重写equals方法。

2. 如何重写equals方法

为了在你的类中使用equals方法,你必须重写Object类中的equals方法,并按照你的需求定义它。一般来说,你需要考虑以下几个方面:

1)比较操作数是否为同一对象

    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
    }

这个防范措施可以减少调用equals方法的次数。如果两个对象引用了同一个地址,那么这两个对象就是相等的。

2)比较操作数是否为同一类

    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
    }

getClass方法返回一个与对象的运行时类相应的Class对象。如果两个操作数类型不同,那么它们是不相等的。如果obj引用为null,这个方法会返回false,表示当前对象不等于空对象。

3)比较操作数的属性

public boolean equals(Object obj) {
    if (this == obj) {
        return true;
    }
    if (obj == null || getClass() != obj.getClass()) {
        return false;
    }
    Person person = (Person) obj;
	
    if (getAge() != person.getAge()) {
        return false;
    }
    if (getName() != null ? !getName().equals(person.getName()) : person.getName() != null) {
        return false;
    }
    return true;
}

这个方法比较两个对象的属性是否相等。在这个例子中,我们比较了人的名字和年龄是否相等。如果不相等,那么这两个人就是不相等的。

3. equals方法的要求和限制

Java中的equals方法有一些要求和限制。首先,equals方法必须是对称的。如果a.equals(b)为真,那么b.equals(a)也必须为真。其次,equals方法必须是传递性的。如果a.equals(b)和b.equals(c)都为真,那么a.equals(c)也必须为真。最后,equals方法必须是一致的。如果a.equals(b)为真,在对象没有被改变的情况下,多次调用a.equals(b)应该总是返回真。

4. hashCode方法

hashCode方法是Object中的一个方法,用于产生一个哈希码。哈希码可以用来快速比较对象是否相等。如果两个对象的哈希码不同,那么这两个对象一定不相等。hashCode方法的一般约定是,如果两个对象equals方法返回true,那么这两个对象的hashCode也应该相等。

public int hashCode() {
    return Objects.hash(getName(), getAge());
}

5. 示例代码

下面是一个Person类的示例代码。在这个例子中,我们重写了equals方法来比较人的名字和年龄是否相等。我们还重写了hashCode方法来返回姓名和年龄的哈希码。

import java.util.Objects;

public class Person {
    private int age;
    private String name;
	
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
	
    public int getAge() {
        return age;
    }
	
    public String getName() {
        return name;
    }
	
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Person person = (Person) obj;
	
        if (getAge() != person.getAge()) {
            return false;
        }
        if (getName() != null ? !getName().equals(person.getName()) : person.getName() != null) {
            return false;
        }
        return true;
    }

    public int hashCode() {
        return Objects.hash(getName(), getAge());
    }
}