Jeśli dwa obiekty są równe wg `equals()`, muszą mieć ten sam `hashCode()`. Kolekcje haszujące (HashMap/HashSet) na tym polegają; złamanie kontraktu powoduje „znikające” wpisy i trudne bugi.
final class User {
private final String email;
User(String email) {
this.email = email;
}
@Override public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User)) return false;
return email.equals(((User) o).email);
}
@Override public int hashCode() {
return email.hashCode();
}
}