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;
}
}