编写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()
方法。