Mediumhashcodeequals
Какой контракт между equals и hashCode?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
Контракт: если a.equals(b) == true, то обязательно a.hashCode() == b.hashCode(). Обратное не требуется (равные hash — допустимая коллизия), но желательно для производительности. Нарушение ломает HashMap/HashSet: «равные» объекты с разным hash попадут в разные корзины.
public class Person {
private final String name;
private final int age;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person p)) return false;
return age == p.age && Objects.equals(name, p.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}Опасно использовать mutable-поля в hashCode — при изменении ключ уже не найти в HashMap.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.