BACK TO BLOG
Set HashCode Gotchas
Оформила контент курса про Sets. С подтемами, аналогиями, пояснениями семантики, и конечно практикой. Знания свежие, надо выгружать.
А насколько хорошо вы знаете Sets?
Попробуйте ответить на мини-вопроc без гпт и гугла 🤓
Какое из утверждений о hashCode() верно?
A) Одинаковый hashCode = одинаковые объекты
B) Равные объекты могут иметь разный hashCode
C) Изменение полей объекта после добавления в HashSet безопасно
D) Равные объекты обязаны иметь одинаковый hashCode
Разбор правильного ответа
Set обеспечивает уникальность. Близнецам, двойняшкам тут не рады.
Под капотом Set массив, но вместо простого индексирования типа:
У Set всё работает умнее. Представим, что хотим добавить что-то в Set. Для этого:
1) Берем объект (например, String, MyClass, и т.п.)
2) Вызываем у него hashCode(), у любого объекта в Java он есть: дефолтный или переопределённый
3) Получаем int, это «сырой хеш»
4) Преобразуем в индекс (через битовую магию) → index
5) Ищем нужную ячейку:
5.1) Пусто? Кладём. The End.
5.2) Занято? Сравниваем с equals():
5.2.1) true → уже есть такой. Игнорируем. The End.
5.2.2) false → разные. Можно добавить. The End.
Теперь по-человечески:
Представьте, что Set это район из частных домов.

Нужно составить список всех уникальных домов.
У каждого дома есть почтовый индекс, через функцию hashCode().
Если два дома имеют один и тот же индекс, мы сравниваем полные адреса через equals()
Тут и вывод:
Два одинаковых индекса ≠ один и тот же дом
Один и тот же дом = всегда один и тот же индекс