Java标准库中的类已经实现了equals()方法。但是我们直接创建的类中没有实现equals(),所以一些基于equals()方法的接口就无法正常使用。比如List中的conrains()方法就是通过对equals()来进行判断元素是否存在于List中。
编写equals
equals()方法要求我们必须满足以下条件:
- 自反性(Reflexive):对于非
null的x来说,x.equals(x)必须返回true; - 对称性(Symmetric):对于非
null的x和y来说,如果x.equals(y)为true,则y.equals(x)也必须为true; - 传递性(Transitive):对于非
null的x、y和z来说,如果x.equals(y)为true,y.equals(z)也为true,那么x.equals(z)也必须为true; - 一致性(Consistent):对于非
null的x和y来说,只要x和y状态不变,则x.equals(y)总是一致地返回true或者false; - 对
null的比较:即x.equals(null)永远返回false。
自己定义的Person类实现equals方法如下
public class Person {public String name;public int age;public boolean equals(Object o) {if (o instanceof Person) {Person p = (Person) o;boolean nameEquals = false;if (this.name == null && p.name == null) {nameEquals = true;}if (this.name != null) {nameEquals = this.name.equals(p.name);}return nameEquals && this.age == p.age;}return false;}}
上面,对于引用字段(String)用equals(),对于基本类型字段(int)用==
上面这种方法因为要判断null的情况,多几个个引用字段写法就太复杂了,我们可以使用Objects.equals()静态方法(记得引入java.util.Objects)。如下
public class Person {public String name;public int age;public boolean equals(Object o) {if (o instanceof Person) {Person p = (Person) o;return Objects.equals(this.name, p.name) && this.age == p.age;}return false;}}
