Вопрос проверяет понимание внутреннего устройства HashMap и работы хеширования.
HashMap использует hashCode() ключа для вычисления номера bucket. Хеш дополнительно обрабатывается, а затем применяется операция по модулю размера массива. Это позволяет равномерно распределять элементы. В одном bucket может храниться несколько элементов при коллизиях.
При добавлении элемента HashMap должен определить, в какую ячейку внутреннего массива его положить.
Определение:
Bucket — это позиция во внутреннем массиве HashMap, в которой хранятся элементы с одинаковым индексом.
Процесс состоит из нескольких шагов.
Получение hashCode
вызывается метод hashCode() у ключа
ключ обязан соблюдать контракт equals / hashCode
Дополнительное перемешивание
старшие и младшие биты комбинируются
это снижает вероятность коллизий
Вычисление индекса
используется побитовая операция
индекс попадает в диапазон массива
int hash = key.hashCode();
int index = (hash ^ (hash >>> 16)) & (n - 1);
элементы попадают в один bucket
сначала используется связанный список
при большом количестве элементов — дерево
плохой hashCode() ведет к деградации производительности
изменение ключа после вставки ломает доступ к элементу
Bucket в HashMap выбирается на основе обработанного hashCode() ключа, а качество этого хеша напрямую влияет на производительность структуры.