Карта должна определить, какой индекс внутренней таблицы использовать для любого заданного ключа, сопоставляя любое значение int
(может быть отрицательным) со значением в диапазоне [0, table.length)
.Когда table.length
является степенью двойки, это можно сделать действительно дешево - и в indexFor
:
static int indexFor(int h, int length) {
return h & (length-1);
}
При другой длине таблицы вам потребуетсявычислить остаток и убедиться, что он не отрицательный.Это определенно микрооптимизация, но, вероятно, действительная:)
Кроме того, когда происходит автоматическая перефразировка, что именно происходит?Хэш-функция тоже изменилась?
Мне не совсем понятно, что вы имеете в виду.Используются те же хеш-коды (потому что они просто вычисляются путем вызова hashCode
для каждого ключа), но они будут по-разному распределены в таблице из-за изменения длины таблицы.Например, когда длина таблицы равна 16, хеш-коды 5 и 21 в итоге сохраняются в записи таблицы 5. Когда длина таблицы увеличивается до 32, они будут в разных записях.