BACK TO BLOG

Set HashCode Gotchas

Оформила контент курса про Sets. С подтемами, аналогиями, пояснениями семантики, и конечно практикой. Знания свежие, надо выгружать.

А насколько хорошо вы знаете Sets?

Попробуйте ответить на мини-вопроc без гпт и гугла 🤓

Какое из утверждений о hashCode() верно?

A) Одинаковый hashCode = одинаковые объекты

B) Равные объекты могут иметь разный hashCode

C) Изменение полей объекта после добавления в HashSet безопасно

D) Равные объекты обязаны иметь одинаковый hashCode

Разбор правильного ответа

Set обеспечивает уникальность. Близнецам, двойняшкам тут не рады.

Под капотом Set массив, но вместо простого индексирования типа:

    array[0] = "jumba";
    array[1] = "q";

У 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()

Тут и вывод:

Два одинаковых индекса ≠ один и тот же дом

Один и тот же дом = всегда один и тот же индекс

Автор:

Айдана Нурланова

LinkedIn Instagram Telegram