编写equals方法
约 671 字大约 2 分钟
2025-07-18
3.1 List 集合中的 equals() 方法
List 是一种有序链表,允许通过索引访问元素。List 提供了 contains(Object o) 方法来判断是否包含指定元素,以及 indexOf(Object o) 方法来返回元素的索引。这两个方法的核心在于判断两个对象是否相等。
在 List 中,判断元素是否相等并非使用 == 运算符,而是调用元素的 equals() 方法。因此,如果自定义类要正确使用 List 的 contains() 和 indexOf() 方法,必须正确覆写 equals() 方法。Java 标准库中的 String、Integer 等类已经正确实现了 equals() 方法,所以可以直接使用。
以下代码展示了 List 如何使用 equals() 方法来判断元素是否包含在列表中:
public class ArrayList {
Object[] elementData;
public boolean contains(Object o) {
for (int i = 0; i < elementData.length; i++) {
if (o.equals(elementData[i])) {
return true;
}
}
return false;
}
}3.2 equals() 方法的编写规范
正确编写 equals() 方法需要满足以下几个条件:
- 自反性 (Reflexive):
x.equals(x)必须返回true。 - 对称性 (Symmetric):如果
x.equals(y)为true,则y.equals(x)也必须为true。 - 传递性 (Transitive):如果
x.equals(y)为true,且y.equals(z)为true,则x.equals(z)也必须为true。 - 一致性 (Consistent):只要
x和y的状态不变,x.equals(y)的返回值必须保持一致。 - 对
null的比较:x.equals(null)永远返回false。
3.3 编写 equals() 方法的步骤
- 确定相等逻辑:明确哪些字段相等才能认为两个实例相等。
- 使用
instanceof判断类型:判断传入的Object是否为当前类型,如果不是,直接返回false。 - 比较字段:对于引用类型,使用
Objects.equals()方法进行比较,该方法会自动处理null值的情况;对于基本类型,直接使用==运算符进行比较。
接下来,我们通过一个 Person 类的例子来展示如何编写 equals() 方法。
import java.util.Objects;
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true; // 如果是同一个对象,直接返回 true
if (o == null || getClass() != o.getClass()) return false; // 如果是 null 或者类型不同,返回 false
Person person = (Person) o; // 类型转换
return age == person.age && Objects.equals(name, person.name); // 比较字段
}
}上面的代码中,首先判断传入的对象是否是 Person 类的实例,如果是,则比较 name 和 age 字段。name 字段使用 Objects.equals() 方法进行比较,避免了手动判断 null 的麻烦。
注意: 如果不调用 List 的 contains()、indexOf() 这些需要比较元素的方法,那么放入的元素就不需要实现 equals() 方法。