首先最常用的是 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);
}