2016-12-03 2 views
0

Я просматриваю класс HashMap в Java. Я понимаю, что емкость хэш-таблицы составляет 2 от мощности количества ведер (емкость 16 означает четыре ведра). Когда вызывается put (ключ, значение), key.hashCode() выводит целочисленное число, и эта новая добавленная пара (ключ, значение) помещается на основе количества кодов buckets.hashCode()%. Но следующее фактическое выполнение в HashMap.classhash() реализация в java

static final int hash(Object key) { 
    int h; 
    return (key == null) ? 0 : (h = key.hashCode())^(h >>> 16); 
} 

Из приведенного выше кода, я не могу понять, как делает установку key.hashCode() значение в ведра произойдет.

ответ

0

Этот код не «подходит» хэш-коду к ковшикам, он «просто» расширяет хэш-код, делая верхние биты более значимыми. Здесь javadoc этого метода.

Вычисляет key.hashCode() и расширяет (XOR) более высокие бит хэша, чтобы опустить. Поскольку в таблице используется маскирование «сила-два», наборы хэшей, которые различаются только в битах выше текущей маски, всегда будут сталкиваться. (Среди известных примеров - наборы Float-ключей, содержащие последовательные целые числа в маленьких таблицах.) Таким образом, мы применяем преобразование, которое распространяется на воздействие более высоких бит вниз. Существует компромисс между скоростью, полезностью и качеством распространения битов. Поскольку многие общие наборы хэшей уже достаточно распределены (так что не извлекайте выгоду из распространения), и потому что мы используем деревья для обработки больших множеств коллизий в бункерах, мы просто XOR немного смещаем биты самым дешевым способом уменьшить системную потерю, а также для включения влияния наивысших битов, которые в противном случае никогда не использовались в вычислениях индекса из-за границ таблиц.

Фактическое установки на ведер делается в методе getNode(int, Object):

first = tab[(n - 1) & hash] 

, где hash является результатом hash(Object) и n является размер хеш-таблицы.

+0

Я уже прошел через ссылку, которую вы прикрепляли (также в hashmap.class). Не могли бы вы рассказать о том, что «это» просто «распространяет хэш-код». – AV94

+0

Я предполагаю, что это оптимизация для небольших (<2^16 записей) HashMaps. Если бы вы не распространяли более высокие биты, они были бы полностью проигнорированы на этих картах. –

+0

Хорошо, теперь яснее. Я думаю, когда значение хэша больше, чем количество ведер, (n-1) & hash просто дает вам остаток. – AV94

Смежные вопросы