ENIGMA AI
ENIGMA AI
Java Средний

Для чего нужны методы hashCode() и equals()? Как их правильно написать?

hashCode() и equals() в Java

Назначение:

equals() — определяет логическое равенство объектов
hashCode() — возвращает числовой код объекта для хеш-коллекций

Контракт:

  1. Если a.equals(b), то a.hashCode() == b.hashCode()
  2. Если hashCode разные, объекты точно не равны
  3. Одинаковый 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 — невидимый ИИ-помощник для технических интервью

Попробовать бесплатно
Все вопросы