首先最常用的是 equals 方法,它的默认实现是比较两个对象的内存地址,也就是和 == 的效果一样,但实际开发中我们常需要按对象的内容比较,比如两个用户对象只要 id 相同就认为相等,这时候就需要重写 equals。比如:

class User {
    private int id;
    private String name;

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        User user = (User) obj;
        return id == user.id;
    }
}

和 equals 配套的必须重写 hashCode 方法,因为 Java 的约定是如果两个对象 equals 返回 true,它们的 hashCode 必须相等;如果 hashCode 不相等,equals 一定返回 false。如果只重写 equals 不重写 hashCode,会导致对象在 HashMap HashSet 等集合中无法正确存储,比如两个 id 相同的 User 对象,equals 返回 true,但 hashCode 不同,会被当成两个不同元素存入集合。重写示例:

@Override
public int hashCode() {
    return Integer.hashCode(id);
}