Как писал Хелпер, он существует на всякий случай, если существующая хеш-функция для ключевых объектов неисправна и не выполняет достаточно хорошую работу по смешиванию младших битов.Согласно источнику , указанному в pgras,
/**
* Returns index for hash code h.
*/
static int indexFor(int h, int length) {
return h & (length-1);
}
В хэш добавляется длина степени два (следовательно, length-1
гарантированно будет последовательностью1s).Из-за этого ANDing используются только младшие биты h
.Остальная часть h
игнорируется.Представьте себе, что по какой-либо причине исходный хеш возвращает только числа, кратные 2. Если бы вы использовали его напрямую, позиции с нечетным номером в хэш-карте никогда не использовались, что привело бы к увеличению числа коллизий в 2 раза.В действительно патологическом случае плохая хеш-функция может заставить хеш-карту вести себя больше как список, чем как контейнер O (1).
Инженеры Sun должны запустить тесты, которые показывают, что слишком много хеш-функций не являются случайнымидостаточно в их младших битах, и что многие хэш-карты недостаточно велики, чтобы когда-либо использовать старшие биты.В этих условиях битовые операции в hash(int h)
в HashMap могут обеспечить чистое улучшение по сравнению с большинством ожидаемых сценариев использования (из-за более низкой частоты столкновений), даже если требуются дополнительные вычисления.