Уважаемые коллеги, столкнулся с таким вопросом касаемо хэш-таблицы, подскажите пожалуйста:
Понятно что каждая ячейка массива может быть либо связанным списком, либо деревом. А как определяется длинна самого массива? Есть ли какой-то обобщенный принцип что-бы мы могли сказать что-то вроде: "контекст в котором данная таблица будет использована, такой-то такой-то, и поэтому мы считаем длину ее массива по такой-то формуле."
Или какие-нибудь, твердо обосновывающие решение о длине критерии, которыми необходимо руководствоваться, при создании своей таблицы?
А как определяется длинна самого массива?
По-умолчанию, создается массив на 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 = 16size = 0loadFactor = 0.75threshold = (int)(16 * 0.75f) = 12Добавили 11 различных пар:
capacity = 16size = 11loadFactor = 0.75threshold = 12После добавления 12-й пары получаем:
capacity = 32size = 12loadFactor = 0.75threshold = (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
Сборка персонального компьютера от Artline: умный выбор для современных пользователей