介绍
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()); } }