HashMap и LinkedHashMap являются двумя наиболее распространенными и универсальными реализациями Map на платформе Java. В основном это классы, основанные на хешах, очень похожие друг на друга и используемые для создания карты. Интерфейс Map является последним из основных интерфейсов Collections Framework, который определяет операции, которые поддерживаются набором связей ключ-значение, в которых ключи являются уникальными. Эти реализации Map основаны на алгоритме хеширования. В то время как класс HashMap реализует неупорядоченные карты, класс LinkedHashMap реализует упорядоченные карты. Реализация LinkedHashMap является подклассом класса HashMap, что означает, что он наследует функции класса HashMap. Существует не так много различий между двумя с точки зрения производительности. Давайте взглянем.
HashMap является одной из наиболее распространенных и среди четырех универсальных реализаций интерфейса Map в Java на основе алгоритма хеширования. Он аналогичен заданному классу HashSet, хотя элементы неупорядочены в обоих классах. Он реализован в виде хеш-таблицы, но в отличие от LinkedHashMap, он не поддерживает порядок ключей или значений. В целом, HashMap обеспечивает постоянную производительность для операций «положить» и «получить». Класс не является потокобезопасным, но он допускает один нулевой ключ и несколько нулевых значений. Поскольку он не поддерживает порядок итераций, он требует меньше памяти.
LinkedHashMap относится к четырем универсальным реализациям интерфейса Map, который является подклассом класса HashMap, что означает, что он наследует свои функции. Хотя с точки зрения производительности он очень похож на HashMap, за исключением того, что он поддерживает порядок вставки ключей, либо в порядке, в котором ключи вставляются в карту, либо в порядке, в котором к записям осуществляется доступ к карте. Он уточняет контракт своего родительского класса, гарантируя порядок, в котором итераторы возвращают его элементы. Однако, он требует больше памяти, чем HashMap, потому что поддерживает двусвязный список в Java.
HashMap - основанная на хэше реализация интерфейса Map в Java. Карты представляют собой набор пар ключ-значение и используются, когда списки находятся в упорядоченной коллекции. HashMap - это класс Collection, который хранит значение в парах ключ-значение. Проще говоря, он сопоставляет ключи со значениями, что означает, что он может найти значение на основе ключа. LinkedHashMap является реализацией связанного списка интерфейса Map, как и HashMap, за исключением того, что он поддерживает порядок вставленных в него элементов. Это подкласс HashMap, который наследует его функции. LinkedHashMap уточняет контракт своего родительского класса, HashMap, гарантируя порядок, в котором итераторы возвращают свои элементы.
Ключевым отличием HashMap от LinkedHashMap является порядок. Элементы HashMap не в порядке, абсолютно случайны, тогда как элементы LinkedHashMap упорядочены. Записи в LinkedHashMap находятся в порядке вставки ключей, который является порядком, в котором ключи вставляются в карту. Это означает, что первый ключ, вставленный в карту, перечисляется первым, равно как и значение, связанное с ним, и последняя запись, вставленная в перечисляемый последний. LinkedHashMap имеет предсказуемый порядок итераций, что означает, что он также может поддерживать свои элементы в порядке доступа, который является порядком, в котором осуществляется доступ к записям.
Классы HashMap и LinkedHashMap используют хеширование для реализации интерфейса Map в Java, за исключением того, что HashMap реализован в виде хеш-таблицы, тогда как LinkedHashMap поддерживает двусвязный список Buckets, проходящий через все его записи. Вот почему LinkedHashMap требует больше памяти, чем HashMap, потому что, в отличие от HashMap, он поддерживает порядок. Он удаляет хаотическое упорядочение с помощью HashMap без дополнительных затрат, которые могли бы возникнуть в противном случае с TreeMap. Кроме того, класс LinkedHashMap очень похож на класс HashMap во многих аспектах, таких как синхронизация и нулевые ключи / значения, поскольку оба допускают один нулевой ключ и несколько нулевых значений.
Хотя оба класса обеспечивают сравнимую производительность, класс HashMap считается предпочтительным выбором, если упорядочение не является проблемой, поскольку оно не гарантирует порядок итерации Map. Такие операции, как добавление, удаление или поиск записей на основе ключа, выполняются с постоянным временем, поскольку они хешируют ключ. Таким образом, добавление, удаление и поиск записей в LinkedHashMap может быть немного медленнее, чем в HashMap, потому что он поддерживает двусвязный список Buckets в Java. Кроме того, HashMap требует меньше памяти, чем LinkedHashMap, потому что порядок не поддерживается.
Хотя классы HashMap и HashMap почти одинаковы по производительности, для HashMap требуется меньше памяти, чем для LinkedHashMap, поскольку он не гарантирует порядок итерации карты, что делает добавление, удаление и поиск записей в HashMap относительно быстрее, чем то же самое с LinkedHashMap. Однако ключевое различие между ними заключается в порядке: элементы HashMap расположены не по порядку, в то время как элементы LinkedHashMap расположены в порядке вставки ключей по умолчанию, то есть в порядке, в котором ключи вставляются в карту. LinkedHashMap также может поддерживать свои элементы в порядке доступа, означающем порядок доступа к записям. Как и в LinkedHashMap, необходимо поддерживать двусвязный список, он имеет меньшую производительность, чем HashMap.