Java标准库中的类已经实现了equals()方法。但是我们直接创建的类中没有实现equals(),所以一些基于equals()方法的接口就无法正常使用。比如List中的conrains()方法就是通过对equals()来进行判断元素是否存在于List中。

编写equals

equals()方法要求我们必须满足以下条件:

  • 自反性(Reflexive):对于非nullx来说,x.equals(x)必须返回true
  • 对称性(Symmetric):对于非nullxy来说,如果x.equals(y)true,则y.equals(x)也必须为true
  • 传递性(Transitive):对于非nullxyz来说,如果x.equals(y)truey.equals(z)也为true,那么x.equals(z)也必须为true
  • 一致性(Consistent):对于非nullxy来说,只要xy状态不变,则x.equals(y)总是一致地返回true或者false
  • null的比较:即x.equals(null)永远返回false

自己定义的Person类实现equals方法如下

  1. public class Person {
  2. public String name;
  3. public int age;
  4. public boolean equals(Object o) {
  5. if (o instanceof Person) {
  6. Person p = (Person) o;
  7. boolean nameEquals = false;
  8. if (this.name == null && p.name == null) {
  9. nameEquals = true;
  10. }
  11. if (this.name != null) {
  12. nameEquals = this.name.equals(p.name);
  13. }
  14. return nameEquals && this.age == p.age;
  15. }
  16. return false;
  17. }
  18. }

上面,对于引用字段(String)用equals(),对于基本类型字段(int)用==
上面这种方法因为要判断null的情况,多几个个引用字段写法就太复杂了,我们可以使用Objects.equals()静态方法(记得引入java.util.Objects)。如下

  1. public class Person {
  2. public String name;
  3. public int age;
  4. public boolean equals(Object o) {
  5. if (o instanceof Person) {
  6. Person p = (Person) o;
  7. return Objects.equals(this.name, p.name) && this.age == p.age;
  8. }
  9. return false;
  10. }
  11. }