Количество записей является количество ключ-значение отображения в карте, возвращенное https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#size-- или в качестве альтернативы, количество элементов в Set
возвращенного https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#entrySet--
Это соответствует наша интуиция о том, что такое карта, набор пар ключ-значение, поэтому каждая пара является одной записью.
По количеству https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html количество записей сравнивается с продуктом коэффициента загрузки fac
, произвольным параметром и мощностью cap
, текущее количество ковшей.
Вы думаете о «когда коэффициент нагрузки достигает», но это неверно. Коэффициент загрузки не изменяется после строительства. По умолчанию это 0.75
, достаточный для почти всех видов использования.
Подумайте вместо threshold
продукт threshold = fac * cap;
. Порог изменяется только тогда, когда изменяется cap
, потому что fac
нет.
Что изменилось все время nentries
, количество записей на карте.
(я просто составление имен переменных, чтобы упростить этот ответ. Они не имеют ничего общего с фактическим исходным кодом Java API.)
Ваша диаграмма показывает пять ведер, так threshold = (int)(0.75 * 5)
или 3
.
Решение перефразировать - if (nentries >= threshold)
. У вас есть десять записей на вашем снимке, так что да, эта карта нуждается в перестройке. Фактически, он бы перефразировал на третьей записи, увеличив cap
примерно до десяти записей в зависимости от реализации. На восьмой позиции емкость увеличится до двадцати, поэтому десять записей будут меньше, чем новый порог, threshold = 0.75 * 20
, или 16
.
Число записей - это количество ключей, да, поскольку каждая клавиша имеет одно и только одно связанное значение, а запись - это пара ключей/значений. Точка f, перефразирующая такую карту, заключается в том, чтобы избежать этого длинного связанного списка, который вредит производительности карты и лучше распределяет записи между ведрами. Идеальное распределение - это когда каждый ковш имеет только 0 или 1 запись. –
Но когда такие столкновения происходят, перефразирование не поможет, не так ли? Только изменение hashFunction будет работать? – Nicky
Нет. Давайте рассмотрим простой пример, где карта имеет 3 ковши, а простой код хеш-кода используется для выбора ведра.Допустим, у вас на карте есть 0, 3 и 6. Все они будут в ведре 0, потому что 0% 3 == 0, 3% 3 == 0 и 6% 3 == 0. Теперь давайте перефразируем и вместо этого используем 7 ковшей. Теперь 0% 7 == 0, поэтому первый ключ переходит в ведро 0. 3% 7 == 3, поэтому 3 заканчивается в ковше 3. 6% 7 == 6, поэтому ключ 6 переходит в ведро 6 И ключи теперь идеально распределены между ведрами. –