―Mashmap -
Преимущества: Супер быстрая скорость запроса и структуры данных, которые могут достичь o (1) Сложность времени - это хэшмап. Динамические данные хранения переменной длины (по сравнению с массивами).
Недостатки: значение хэша необходимо рассчитать дополнительное, и если оно не обрабатывается должным образом, это займет дополнительное место.
«Как использовать хэшмап
Обычно мы используем HashMap следующим образом
Map <integer, string> maps = new hashmap <integer, string> (); maps.put (1, "a"); maps.put (2, "b");
Приведенный выше код создает новый хэшмап и вставляет два данных. Основные типы данных здесь не принимаются, чтобы сделать K и V.
Если вы напишите это, будут проблемы:
Map <int, double> maps = new Hashmap <int, double> ();
Почему мы используем этот путь? Пожалуйста, смотрите исходный код:
Общедоступный класс Hashmap <K, V> расширяет AbstractMap <K, V> реализует карту <K, V>, клонируемый, сериализуемый
Это определение класса реализации HashMap.
―Mashmap является динамически переменной структурой данных
При использовании HashMap, чтобы повысить эффективность выполнения, мы часто устанавливаем способность инициализации HashMap:
Карта <string, string> rm = new hashmap <string, string> (2)
Или используйте карты класса инструментов Guava, чтобы легко создать коллекцию и инициализировать значение с соответствующим размером.
Map <string, object> map = maps.newhashmapwithexpectedsize (7);
Так зачем использовать это так? Давайте посмотрим на их источник конструктор.
Конструктор без параметров:
public hashmap () {this.loadfactor = default_load_factor; threshold = (int) (default_initial_capacity * default_load_factor); Таблица = Новая запись [default_initial_capacity]; init (); } public hashmap () {
this.loadfactor = default_load_factor;
threshold = (int) (default_initial_capacity * default_load_factor);
Таблица = Новая запись [default_initial_capacity];
init ();
}
/** * Конструирует пустой <tt> hashmap </tt> с указанной начальной * емкостью и коэффициентом загрузки по умолчанию (0,75). * * @param initialcapacity Начальная емкость. * @Throws allogalArgumentException, если начальная емкость отрицательна. */ public hashmap (int initialCapacity) {this (initialCapacity, default_load_factor); }Объяснение существительных:
Default_load_factor // Коэффициент загрузки по умолчанию, 0,75, если не указан. DEFAULT_INITIAL_CAPACEY // Инициализация по умолчанию, по умолчанию - 16 пороговое значение // Значение порога (YU) рассчитывается на основе коэффициента нагрузки и способности инициализации. <span style = "color: rgb (54, 46, 43); font-family:" Microsoft Yahei ";"> Порог означает, что когда размер HashMap больше, чем порог, будет выполнена операция изменения размера.
Таким образом, мы знаем, что если мы назваем конструктор без параметра, мы получим массив из 16 емкости.
Итак, вопрос: что, если начальной емкости недостаточно?
Массивы имеют фиксированную длину, как использовать данные с фиксированной длиной для представления данных неопределенной длины? Ответ состоит в том, чтобы найти более длинную, но он снижает эффективность при изменениях. Поэтому мы рекомендуем, чтобы HashMap была предоставлена надежной емкостью при инициализации.
―Mashmap поместить метод
public v put (k key, v value) {if (key == null) // Если ключ пуста, разница между Hashmap и Hashtable возвращает PutfornullKey (значение); int hash = hash (key.hashcode ()); // Обработка значения хэша на основе хэшкода ключа int i = indexfor (hash, table.length); // Обработка подписка массива для размещения на основе значения хэша для (intry <k, v> e = table [i]; e! = Null; e = e.next) {// Все для цикла реализует, что если k существует, то замените v объект k; if (e.hash == hash && ((k = e.key) == key || key.equals (k))) {v oldvalue = e.value; e.value = значение; e.recordaccess (это); вернуть OldValue; }} modcount ++; // счетчик счетчиков (хэш, ключ, значение, i); // Добавить в массив return null; }Если вставленные данные превышают существующую емкость, они будут выполнены
AddEntry (хэш, ключ, значение, i);
void AddEntry (int hash, k -ключ, v Значение, int bucketIndex) {intpirt <K, v> e = table [bucketIndex]; Таблица [BucketIndex] = Новая запись <K, V> (хэш, ключ, значение, E); if (size ++> = threshold) <span style = "color:#ff0000;"> <strong> resize (2 * table.length);}Здесь отображается порог текущего размера ++>, то текущий размер будет расширен дважды и будет выполнен (2*Table.length). Так как они расширяются?
void reszize (int newcapacity) {inpit [] oldtable = table; int oldCapacity = oldtable.length; if (OldCapacity == Maximum_Capacity) {threshold = integer.max_value; возвращаться; } Inpit [] newtable = new intry [newCapacity]; <span style = "color: rgb (51, 51, 51); font-family: arial;"> Новый новый массив, </span> <strong> <span style = "color:#ff0000;"> transfer (newtable); </span> </strong> // Передача массива в новую таблицу массива = newtable; threshold = (int) (newcapacity * loadfactor); // пересчитывать емкость}Как передается передача массива передачи?
void Transfer (entry [] newtable) {inpit [] src = table; int newcapacity = newtable.length; for (int j = 0; j <src.length; j ++) {inpit <k, v> e = src [j]; if (e! = null) {src [j] = null; do {inpit <K, v> next = e.next; int i = <strong> <span style = "color:#ff0000;"> indexfor (e.hash, newcapacity); // пересчитывать индекс на основе емкости значения хэша </span> </strong> e.next = newtable [i]; Newtable [i] = E; e = Далее; } while (e! = null); }}}― Количество дополнительных казней расширения HashMap-
Так что, если мы хотим добавить хэшмап из 1000 элементов, если мы используем значение по умолчанию, сколько дополнительных вычислений мне нужно рассчитать?
Когда он превышает 16*0,75 = 12, его необходимо пересматривать 12 раз
Когда он больше 16*2*0,75 = 24, требуются дополнительные 24 расчета.
...
Когда он превышает 16*n*0,75 = 768, требуется дополнительные 768 расчетов.
Таким образом, мы рассчитали 12+24+48+…+768 раз в процессе расширения
Поэтому настоятельно рекомендуется, чтобы мы вручную указали начальный размер, если мы знаем область в проекте, как это:
Map <integer, string> maps = new hashmap <integer, string> (1000);
Резюме: Вот почему эффективность выполнения HashMap строго снижается, если она превышает начальную мощность во время использования.
Выше приведенное дело о использовании HashMap в этой статье об анализе исходного кода Java, я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!