Java
Средний
Для чего нужны методы hashCode() и equals()? Как их правильно написать?
hashCode() и equals() в Java
Назначение:
equals() — определяет логическое равенство объектов
hashCode() — возвращает числовой код объекта для хеш-коллекций
Контракт:
- Если
a.equals(b), тоa.hashCode() == b.hashCode() - Если
hashCodeразные, объекты точно не равны - Одинаковый
hashCodeНЕ гарантирует равенство (коллизии)
Правильная реализация:
public class User {
private String name;
private int age;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return age == user.age &&
Objects.equals(name, user.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
Почему важно переопределять оба:
// Без переопределения hashCode():
Set<User> set = new HashSet<>();
User u1 = new User("Alice", 30);
User u2 = new User("Alice", 30);
set.add(u1);
set.contains(u2); // false! Разные hashCode
// С правильным hashCode():
set.contains(u2); // true
Требования к equals():
- Рефлексивность:
x.equals(x) == true - Симметричность:
x.equals(y) == y.equals(x) - Транзитивность:
x=y, y=z → x=z - Консистентность: многократные вызовы = одинаковый результат
- null:
x.equals(null) == false
Типичные ошибки:
// ПЛОХО: использование instanceof с наследованием
@Override
public boolean equals(Object o) {
if (!(o instanceof User)) return false; // Нарушает симметричность
// ...
}
// ХОРОШО: getClass()
if (o == null || getClass() != o.getClass()) return false;
Похожие вопросы
Готовитесь к собеседованию?
ENIGMA AI — невидимый ИИ-помощник для технических интервью
Попробовать бесплатно