Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: hashcode, equals

Что произойдёт, если два объекта равны по equals(), но у них разные hashCode()?

Вопрос проверяет понимание контракта между методами equals() и hashCode() в Java и последствий его нарушения.

Короткий ответ

Если объекты равны по equals(), но имеют разные hashCode(), это нарушает контракт этих методов. Такие объекты будут некорректно работать в hash-коллекциях (HashMap, HashSet). Они могут не находиться в коллекции, даже если были добавлены, или могут создавать дубликаты. Это приводит к непредсказуемому поведению программы.

Длинный ответ

Контракт между equals() и hashCode() является фундаментальным принципом работы с hash-коллекциями в Java.

Требования контракта:

  1. Если два объекта равны по equals(), их hashCode() должен быть одинаковым

  2. Обратное не обязательно: разные объекты могут иметь одинаковый hashCode()

Последствия нарушения контракта:

Проблемы с HashMap/HashSet:

  • Объекты могут не находиться в коллекции, даже если они там есть

  • Возможны дубликаты объектов в Set-коллекциях

  • Поиск и удаление элементов работают некорректно

Пример проблемы:

class Person {
    String name;
    
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(name, person.name);
    }
    
    // Нарушение: hashCode не переопределен
}

Person p1 = new Person("John");
Person p2 = new Person("John");

System.out.println(p1.equals(p2)); // true
System.out.println(p1.hashCode() == p2.hashCode()); // false - нарушение!

Set<Person> set = new HashSet<>();
set.add(p1);
set.contains(p2); // может вернуть false, хотя должен true

Правильная реализация:

@Override
public int hashCode() {
    return Objects.hash(name);
}

Вывод: Всегда необходимо обеспечивать соответствие между equals() и hashCode() для корректной работы с hash-коллекциями.

Уровень

  • Рейтинг:

    2

  • Сложность:

    7

Навыки

  • Java

    Java

Ключевые слова

#hashcode

#equals

Подпишись на Java Developer в телеграм