Уважаемые коллеги, столкнулся с таким вопросом касаемо хэш-таблицы, подскажите пожалуйста:
Понятно что каждая ячейка массива может быть либо связанным списком, либо деревом. А как определяется длинна самого массива? Есть ли какой-то обобщенный принцип что-бы мы могли сказать что-то вроде: "контекст в котором данная таблица будет использована, такой-то такой-то, и поэтому мы считаем длину ее массива по такой-то формуле."
Или какие-нибудь, твердо обосновывающие решение о длине критерии, которыми необходимо руководствоваться, при создании своей таблицы?
А как определяется длинна самого массива?
По-умолчанию, создается массив на 16 элементов (корзин).
У HashMap
есть такие атрибуты, как:
capacity
– вместимость/емкость (текущий размер массива, полем класса не является);size
– количество элементов, находящихся в HashMap
;loadFactor
– коэффициент загрузки;threshold
– пороговое значение количества элементов HashMap
'а.При этом threshold
рассчитывается как capacity * load factor
.
После добавления пары в HashMap
происходит проверка:
if (size++ >= threshold)
и, если количество элементов HashMap
'а равно или превышает пороговое значение, то создается новый массив, размер которого в два раза больше размера старого массива:
resize(2 * table.length);
при этом все элементы старого массива распределяются в новый массив и изменяется значение capacity
и пересчитывается threshold
.
Пример:
Создали HashMap
с параметрами по-умолчанию:
capacity = 16
size = 0
loadFactor = 0.75
threshold = (int)(16 * 0.75f) = 12
Добавили 11 различных пар:
capacity = 16
size = 11
loadFactor = 0.75
threshold = 12
После добавления 12-й пары получаем:
capacity = 32
size = 12
loadFactor = 0.75
threshold = (int)(32 * 0.75f) = 24
Все вышенаписанное справедливо для JDK 7 и ниже, а вот в JDK 8 расширение таблицы происходит несколько иначе.
Если мы создаем Map hashMap = new Hashmap()
То по умолчанию размер busket
-a 16 и коэффициент нагрузки 0,75(load factor).
Когда число записей в хэш-таблице превышает коэффициента нагрузки, то она в два раза увеличивает размет busket
-a.
Так же можно задать размер busket
-a
HashMap(int initialCapacity)
HashMap(int initialCapacity, float loadFactor)
https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как преобразовать binary(записано в string 111010000001110000000000) в integer?
Не могу понять по какой причине кнопка с ID totalButton, не расширяется на 2 строки, хотя rowSpan="2" указан
У меня была одна БД, потом пришлось создать еще одну для других целейПосле создания поменял DATEBASE_VERSION, но все ровно ошибка: