1. 等价关系
    两个对象具有等价关系,需要满足以下五个条件:
    Ⅰ 自反性

    1. x.equals(x); // true

    Ⅱ 对称性

    1. x.equals(y) == y.equals(x); // true

    Ⅲ 传递性

    1. if (x.equals(y) && y.equals(z))
    2. x.equals(z); // true;

    Ⅳ 一致性
    多次调用 equals() 方法结果不变

    1. x.equals(y) == x.equals(y); // true

    Ⅴ 与 null 的比较
    对任何不是 null 的对象 x 调用 x.equals(null) 结果都为 false

    1. x.equals(null); // false;

    2. 等价与相等

    • 对于基本类型,== 判断两个值是否相等,基本类型没有 equals() 方法。
    • 对于引用类型,== 判断两个变量是否引用同一个对象,而 equals() 判断引用的对象是否等价。

      1. Integer x = new Integer(1);
      2. Integer y = new Integer(1);
      3. System.out.println(x.equals(y)); // true
      4. System.out.println(x == y); // false

      3. 实现

    • 检查是否为同一个对象的引用,如果是直接返回 true;

    • 检查是否是同一个类型,如果不是,直接返回 false;
    • 将 Object 对象进行转型;
    • 判断每个关键域是否相等。

      1. public class EqualExample {
      2. private int x;
      3. private int y;
      4. private int z;
      5. public EqualExample(int x, int y, int z) {
      6. this.x = x;
      7. this.y = y;
      8. this.z = z;
      9. }
      10. @Override
      11. public boolean equals(Object o) {
      12. if (this == o) return true;
      13. if (o == null || getClass() != o.getClass()) return false;
      14. EqualExample that = (EqualExample) o;
      15. if (x != that.x) return false;
      16. if (y != that.y) return false;
      17. return z == that.z;
      18. }
      19. }