equals 方法


实现 equals() 方法,要实现以下四点:

  • 自反性:对于任何非 null 引用 x,x.equals(x)必须返回 true。
  • 对称性:对于任何非 null 引用 x 和 y,当 y.equals(x) 返回 true 时,x.equals(y) 也必须返回 true。
  • 传递性:对于任何非 null 引用x,y 和 z,当 x.equals(y) 返回 true,并且 y.equals(z) 也返回 true,那么 x.equals(z) 也必须返回 true。
  • 一致性:对于任何非 null 引用 x 和 y,只要 equals 方法用到的信息没有被修改,多次调用 x.equals(y)应该一致性地返回 true 或 false。

总结五点实现 equals 方法的诀窍:

  • 使用 == 操作符判断参数是否为这个对象的引用。
  • 使用 instanceof 判断参数是否为正确的类型。
  • 把参数转换为正确的类型:因为有上一步的类型检查,所以能确保转型成功。
  • 对每个关键域,检查参数中的域是否与对象中的对应域相等:注意有些对象的域可能包含 null
  • 编写完 equals 方法之后应该问自己3个问题:它是否是对称的?传递的?一致的?

最后实现 equals 方法有三个告诫:

  • 覆盖 equals 方法的同时一定要覆盖 hashCode 方法。
  • 不要企图让 equals 方法过于智能。
  • 不要将 equals 方法中的 Object 类型替换为其他类型。