Класс LinkedHashMap<K, V>
- Параметры типа:
K- тип ключей, хранящихся в этой картеV- тип отображаемых значений
- Все реализованные интерфейсы:
Serializable, Cloneable, Map<K,V>, SequencedMap<K, V>
public class LinkedHashMap<K,V> extends HashMap<K,V> implements SequencedMap<K,V>
Реализация интерфейса Map на основе хеш-таблицы и связного списка с определенным порядком обхода. Эта реализация отличается от HashMap тем, что поддерживает двусвязный список, проходящий через все его записи. Этот связный список определяет порядок обхода (порядок итерации), который обычно соответствует порядку вставки ключей в карту (порядку вставки). Первой идет запись, вставленная раньше всех (самая старая), последней — вставленная позже всех (самая новая). Обратите внимание, что повторная вставка ключа в карту с помощью метода put не влияет на порядок обхода. (Ключ k повторно вставляется в карту m, если при вызове m.put(k, v) метод m.containsKey(k) непосредственно перед вызовом возвращает true.) Представление этой карты в обратном порядке имеет противоположный порядок: первой идет самая новая запись, а последней — самая старая. Порядок обхода уже имеющихся в карте записей можно изменить с помощью методов putFirst и putLast.
Эта реализация избавляет клиентский код от неопределенного, обычно хаотичного порядка, предоставляемого HashMap (и Hashtable), не неся при этом дополнительных затрат, связанных с TreeMap. С ее помощью можно создать копию карты с тем же порядком элементов, что и у исходной карты, независимо от реализации исходной карты:
void foo(Map<String, Integer> m) {
Map<String, Integer> copy = new LinkedHashMap<>(m);
...
}
Этот прием особенно полезен, если модуль принимает карту в качестве входных данных, копирует ее, а затем возвращает результаты, порядок которых определяется порядком копии. (Обычно клиентам удобно получать данные в том же порядке, в котором они были переданы.) Для создания связанной хеш-карты, порядок обхода которой соответствует порядку последнего доступа к ее записям — от наименее недавно использованной до наиболее недавно использованной (порядок доступа), предусмотрен специальный конструктор constructor. Карты такого типа хорошо подходят для создания LRU-кэшей. Вызов методов put, putIfAbsent, get, getOrDefault, compute, computeIfAbsent, computeIfPresent или merge приводит к обращению к соответствующей записи (если она существует после завершения вызова). Методы replace приводят к обращению к записи только в том случае, если значение заменяется. Метод putAll выполняет по одному обращению к записи для каждого соответствия в указанной карте в порядке, в котором пары ключ-значение предоставляются итератором набора записей этой карты. Никакие другие методы не приводят к обращениям к записям. Вызов этих методов для обратного представления приводит к обращениям к записям базовой карты. Обратите внимание, что в обратном представлении при обращении к записи она перемещается в начало порядка обхода. Методы явного позиционирования, такие как putFirst или lastEntry, независимо от того, вызываются ли они для карты или для ее представления в обратном порядке, выполняют операцию позиционирования и не приводят к обращениям к записям. Операции с представлениями keySet, values и entrySet или с соответствующими им упорядоченными представлениями не влияют на порядок обхода базовой карты.
Метод removeEldestEntry(Map.Entry) можно переопределить, чтобы задать политику автоматического удаления устаревших соответствий при добавлении новых соответствий в карту. Кроме того, поскольку «самая старая» запись является первой в порядке обхода, программы могут проверять и удалять устаревшие соответствия с помощью методов firstEntry и pollFirstEntry.
Этот класс предоставляет все необязательные операции Map и SequencedMap и допускает элементы null. Как и HashMap, он обеспечивает постоянное время выполнения основных операций (add, contains и remove), если хеш-функция правильно распределяет элементы по корзинам. Производительность, вероятно, будет лишь немного ниже, чем у HashMap, из-за дополнительных затрат на поддержку связного списка; исключением является итерация по представлениям-коллекциям LinkedHashMap, для которой требуется время, пропорциональное размеру карты, независимо от ее емкости. Итерация по HashMap, вероятно, будет более затратной и потребует времени, пропорционального ее емкости.
На производительность связанной хеш-карты влияют два параметра: начальная емкость и коэффициент загрузки. Они определены точно так же, как для HashMap. Однако обратите внимание, что чрезмерно высокое значение начальной емкости менее существенно для этого класса, чем для HashMap, поскольку емкость не влияет на время итерации в этом классе.
Обратите внимание, что эта реализация не синхронизирована. Если несколько потоков одновременно обращаются к связанной хеш-карте и хотя бы один из них структурно изменяет карту, доступ должен синхронизироваться извне. Обычно синхронизацию выполняют на объекте, который естественным образом инкапсулирует карту. Если такого объекта нет, карту следует «обернуть» с помощью метода Collections.synchronizedMap. Лучше всего сделать это при создании карты, чтобы предотвратить случайный доступ к ней без синхронизации:
Map m = Collections.synchronizedMap(new LinkedHashMap(...));Структурным изменением считается любая операция, добавляющая или удаляющая одно или несколько соответствий, а в случае связанных хеш-карт с порядком доступа — также операция, влияющая на порядок итерации. В связанных хеш-картах с порядком вставки простое изменение значения, связанного с уже имеющимся в карте ключом, не является структурным изменением. В связанных хеш-картах с порядком доступа даже простой запрос к карте с помощью
get является структурным изменением. ) Итераторы, возвращаемые методом iterator коллекций, полученных с помощью методов представлений-коллекций этого класса, являются быстро завершающимися при изменении (fail-fast): если после создания итератора карта структурно изменится каким-либо способом, кроме вызова собственного метода remove итератора, итератор выбросит исключение ConcurrentModificationException. Таким образом, при параллельном изменении итератор быстро и корректно завершает работу, а не рискует в неопределенный момент в будущем привести к произвольному недетерминированному поведению.
Обратите внимание, что гарантировать быстрое завершение итератора при изменении невозможно, поскольку, вообще говоря, нельзя дать строгих гарантий при несинхронизированном параллельном изменении. Итераторы выбрасывают ConcurrentModificationException лишь при первой возможности. Поэтому не следует писать программу, корректность которой зависит от этого исключения: быстрое завершение итераторов при изменении следует использовать только для обнаружения ошибок.
Сплитераторы, возвращаемые методом spliterator коллекций, полученных с помощью методов представлений-коллекций этого класса, имеют отложенное связывание, быстро завершаются при изменении и дополнительно сообщают характеристику Spliterator.ORDERED.
Этот класс входит в состав Java Collections Framework.
- Примечание по реализации:
- Сплитераторы, возвращаемые методом spliterator коллекций, полученных с помощью методов представлений-коллекций этого класса, создаются на основе итераторов соответствующих коллекций.
- С версии:
- 1.4
- См. также:
Краткое описание вложенных классов
Вложенные классы/интерфейсы, объявленные в классе AbstractMap
AbstractMap.SimpleEntry<K, V>, AbstractMap.SimpleImmutableEntry<K, V>
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
LinkedHashMap() |
Создает пустой экземпляр LinkedHashMap с порядком вставки, начальной емкостью по умолчанию (16) и коэффициентом загрузки (0,75). |
LinkedHashMap |
Создает пустой экземпляр LinkedHashMap с порядком вставки, указанной начальной емкостью и коэффициентом загрузки по умолчанию (0,75). |
LinkedHashMap |
Создает пустой экземпляр LinkedHashMap с порядком вставки, указанными начальной емкостью и коэффициентом загрузки. |
LinkedHashMap |
Создает пустой экземпляр LinkedHashMap с указанными начальной емкостью, коэффициентом загрузки и режимом упорядочения. |
LinkedHashMap |
Создает экземпляр LinkedHashMap с порядком вставки, содержащий те же соответствия, что и указанная карта. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
clear() |
Удаляет все соответствия из этой карты. |
boolean |
containsValue |
Возвращает true, если эта карта сопоставляет один или несколько ключей с указанным значением. |
Set |
entrySet() |
Возвращает представление Set соответствий, содержащихся в этой карте. |
V |
get |
Возвращает значение, сопоставленное с указанным ключом, или null, если в этой карте нет соответствия для данного ключа. |
Set |
keySet() |
Возвращает представление Set ключей, содержащихся в этой карте. |
static <K, |
newLinkedHashMap |
Создает новую пустую LinkedHashMap с порядком вставки, подходящую для ожидаемого количества соответствий. |
V |
putFirst |
Вставляет указанное соответствие в карту, если его там еще нет, либо заменяет значение соответствия, если оно уже есть (необязательная операция). |
V |
putLast |
Вставляет указанное соответствие в карту, если его там еще нет, либо заменяет значение соответствия, если оно уже есть (необязательная операция). |
protected boolean |
removeEldestEntry |
Возвращает true, если эта карта должна удалить самую старую запись. |
SequencedMap |
reversed() |
Возвращает представление этой карты в обратном порядке. |
SequencedSet |
sequencedEntrySet() |
Возвращает представление SequencedSet набора entrySet этой карты. |
SequencedSet |
sequencedKeySet() |
Возвращает представление SequencedSet набора keySet этой карты. |
SequencedCollection |
sequencedValues() |
Возвращает представление SequencedCollection коллекции values этой карты. |
Collection |
values() |
Возвращает представление Collection значений, содержащихся в этой карте. |
Методы, объявленные в классе HashMap
clear, clone, compute, computeIfAbsent, computeIfPresent, containsKey, isEmpty, merge, newHashMap, put, putAll, remove, size
Методы, объявленные в классе AbstractMap
equals, hashCode, toString
Методы, объявленные в интерфейсе Map
compute, computeIfAbsent, computeIfPresent, containsKey, equals, forEach, getOrDefault, hashCode, isEmpty, merge, put, putAll, putIfAbsent, remove, remove, replace, replace, replaceAll, size
Методы, объявленные в интерфейсе SequencedMap
firstEntry, lastEntry, pollFirstEntry, pollLastEntry
Подробное описание конструкторов
LinkedHashMap
public LinkedHashMap(int initialCapacity, float loadFactor)
LinkedHashMap с указанными начальной емкостью и коэффициентом загрузки.- Примечание API:
- Чтобы создать
LinkedHashMapс начальной емкостью, рассчитанной на ожидаемое количество отображений, используйтеnewLinkedHashMap. - Параметры:
-
initialCapacity— начальная емкость -
loadFactor— коэффициент загрузки - Исключения:
-
IllegalArgumentException— если начальная емкость отрицательна или коэффициент загрузки неположителен
LinkedHashMap
public LinkedHashMap(int initialCapacity)
LinkedHashMap с указанной начальной емкостью и коэффициентом загрузки по умолчанию (0.75).- Примечание API:
- Чтобы создать
LinkedHashMapс начальной емкостью, рассчитанной на ожидаемое количество отображений, используйтеnewLinkedHashMap. - Параметры:
-
initialCapacity— начальная емкость - Исключения:
-
IllegalArgumentException— если начальная емкость отрицательна
LinkedHashMap
public LinkedHashMap()
LinkedHashMap с начальной емкостью по умолчанию (16) и коэффициентом загрузки по умолчанию (0.75).LinkedHashMap
public LinkedHashMap(Map<? extends K, ? extends V> m)
LinkedHashMap с теми же отображениями, что и в указанной карте. Экземпляр LinkedHashMap создается с коэффициентом загрузки по умолчанию (0.75) и начальной емкостью, достаточной для хранения отображений указанной карты.- Параметры:
-
m— карта, отображения из которой следует поместить в эту карту - Исключения:
-
NullPointerException— если указанная карта равна null
LinkedHashMap
public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
LinkedHashMap с указанными начальной емкостью, коэффициентом загрузки и режимом упорядочения.- Параметры:
-
initialCapacity— начальная емкость -
loadFactor— коэффициент загрузки -
accessOrder— режим упорядочения:trueдля упорядочения по доступу,falseдля упорядочения по вставке - Исключения:
-
IllegalArgumentException— если начальная емкость отрицательна или коэффициент загрузки неположителен
Подробное описание методов
putFirst
public V putFirst(K k, V v)
Если в этой карте уже есть отображение для данного ключа, оно при необходимости перемещается, чтобы стать первым в порядке обхода.
- Определено в:
-
putFirstв интерфейсеSequencedMap<K,V> - Параметры:
-
k— ключ -
v— значение - Возвращает:
- значение, ранее связанное с k, или null, если такого значения не было
- С версии:
- 21
putLast
public V putLast(K k, V v)
Если в этой карте уже есть отображение для данного ключа, оно при необходимости перемещается, чтобы стать последним в порядке обхода.
- Определено в:
-
putLastв интерфейсеSequencedMap<K,V> - Параметры:
-
k— ключ -
v— значение - Возвращает:
- значение, ранее связанное с k, или null, если такого значения не было
- С версии:
- 21
containsValue
public boolean containsValue(Object value)
true, если эта карта связывает один или несколько ключей с указанным значением.- Определено в:
-
containsValueв интерфейсеMap<K,V> - Переопределяет:
-
containsValueв классеHashMap<K,V> - Параметры:
-
value— значение, наличие которого в этой карте проверяется - Возвращает:
-
true, если эта карта связывает один или несколько ключей с указанным значением
get
public V get(Object key)
null, если эта карта не содержит отображения для данного ключа. Формально, если эта карта содержит отображение от ключа k к значению v, такое что (key==null ? k==null :
key.equals(k)), этот метод возвращает v; в противном случае он возвращает null. (Такое отображение может быть не более чем одно.)
Возвращаемое значение null не обязательно означает, что карта не содержит отображения для данного ключа; также возможно, что карта явно связывает этот ключ со значением null. Чтобы различить эти два случая, можно использовать операцию containsKey.
clear
removeEldestEntry
protected boolean removeEldestEntry(Map.Entry<K,V> eldest)
true, если эта карта должна удалить самую старую запись. Этот метод вызывается методами put и putAll после вставки новой записи в карту. Он предоставляет реализующему класс возможность удалять самую старую запись при каждом добавлении новой. Это полезно, если карта представляет собой кэш: так карта может сократить потребление памяти, удаляя устаревшие записи. Пример использования: это переопределение позволит карте вырасти до 100 записей, а затем удалять самую старую запись при каждом добавлении новой, поддерживая постоянное количество записей, равное 100.
private static final int MAX_ENTRIES = 100;
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > MAX_ENTRIES;
}
Обычно этот метод никак не изменяет карту, а позволяет карте изменять себя в соответствии с возвращаемым значением. Допускается, чтобы этот метод напрямую изменял карту, но в таком случае он должен возвращать false (указывая, что карта не должна предпринимать дальнейших изменений). Последствия возврата true после изменения карты непосредственно из этого метода не определены.
Эта реализация просто возвращает false (поэтому эта карта ведет себя как обычная карта — самый старый элемент никогда не удаляется).
- Параметры:
-
eldest— запись, вставленная в карту раньше всех, или, если карта упорядочена по доступу, запись, к которой обращались раньше всех. Эта запись будет удалена, если метод вернетtrue. Если до вызоваputилиputAll, приведшего к вызову этого метода, карта была пуста, это будет только что вставленная запись; иными словами, если карта содержит одну запись, самая старая запись одновременно является самой новой. - Возвращает:
-
true, если самую старую запись следует удалить из карты;false, если ее следует сохранить.
keySet
public Set<K> keySet()
Set. Порядок обхода ключей в представлении совпадает с порядком обхода отображений этой карты. Набор поддерживается картой, поэтому изменения карты отражаются в наборе, и наоборот. Если карта изменяется во время обхода набора (за исключением вызовов операции remove самого итератора), результаты обхода не определены. Набор поддерживает удаление элементов, при котором соответствующее отображение удаляется из карты, с помощью операций Iterator.remove, Set.remove, removeAll, retainAll и clear. Операции add и addAll не поддерживаются. Его Spliterator, как правило, обеспечивает более высокую производительность при последовательной обработке, но значительно более низкую производительность при параллельной обработке, чем HashMap.sequencedKeySet
public SequencedSet<K> sequencedKeySet()
SequencedSet для keySet этой карты. Возвращаемое представление обладает теми же характеристиками, что и представление, возвращаемое методом keySet.
- Определено в:
-
sequencedKeySetв интерфейсеSequencedMap<K,V> - Возвращает:
- представление
SequencedSetдляkeySetэтой карты - С версии:
- 21
values
public Collection<V> values()
Collection. Порядок обхода значений в представлении совпадает с порядком обхода записей этой карты. Коллекция поддерживается картой, поэтому изменения карты отражаются в коллекции, и наоборот. Если карта изменяется во время обхода коллекции (за исключением вызовов операции remove самого итератора), результаты обхода не определены. Коллекция поддерживает удаление элементов, при котором соответствующее отображение удаляется из карты, с помощью операций Iterator.remove, Collection.remove, removeAll, retainAll и clear. Операции add и addAll не поддерживаются. Ее Spliterator, как правило, обеспечивает более высокую производительность при последовательной обработке, но значительно более низкую производительность при параллельной обработке, чем HashMap.sequencedValues
public SequencedCollection<V> sequencedValues()
SequencedCollection для коллекции values этой карты. Возвращаемое представление обладает теми же характеристиками, что и представление, возвращаемое методом values.
- Определено в:
-
sequencedValuesв интерфейсеSequencedMap<K,V> - Возвращает:
- представление
SequencedCollectionдля коллекцииvaluesэтой карты - С версии:
- 21
entrySet
public Set<Map.Entry<K,V>> entrySet()
Set. Порядок обхода представления совпадает с порядком обхода записей этой карты. Набор поддерживается картой, поэтому изменения карты отражаются в наборе, и наоборот. Если карта изменяется во время обхода набора (за исключением вызовов операции remove самого итератора или операции setValue для записи карты, возвращенной итератором), результаты обхода не определены. Набор поддерживает удаление элементов, при котором соответствующее отображение удаляется из карты, с помощью операций Iterator.remove, Set.remove, removeAll, retainAll и clear. Операции add и addAll не поддерживаются. Его Spliterator, как правило, обеспечивает более высокую производительность при последовательной обработке, но значительно более низкую производительность при параллельной обработке, чем HashMap.sequencedEntrySet
public SequencedSet<Map.Entry<K,V>> sequencedEntrySet()
SequencedSet для entrySet этой карты. Возвращаемое представление обладает теми же характеристиками, что и представление, возвращаемое методом entrySet.
- Определено в:
-
sequencedEntrySetв интерфейсеSequencedMap<K,V> - Возвращает:
- представление
SequencedSetдляentrySetэтой карты - С версии:
- 21
newLinkedHashMap
public static <K,V> LinkedHashMap<K,V> newLinkedHashMap(int numMappings)
- Параметры типа:
K— тип ключей новой картыV— тип отображаемых значений- Параметры:
-
numMappings— ожидаемое количество отображений - Возвращает:
- только что созданную карту
- Исключения:
-
IllegalArgumentException— если numMappings отрицательно - С версии:
- 19
reversed
public SequencedMap<K,V> reversed()
Изменения обратного представления и его представлений карты допускаются и будут передаваться этой карте. Кроме того, изменения этой карты будут видны в обратном представлении и его представлениях карты.
- Определено в:
-
reversedв интерфейсеSequencedMap<K,V> - Возвращает:
- представление этой карты с обратным порядком
- С версии:
- 21
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/LinkedHashMap.html