Класс LinkedHashMap<K, V>
- Type Parameters:
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, и он допускает нулевые элементы. Подобно классу HashMap, он обеспечивает постоянное время выполнения основных операций (add, contains и remove), предполагая, что функция хеширования правильно распределяет элементы по корзинам. Производительность, скорее всего, будет немного ниже, чем у HashMap, из-за дополнительных затрат на поддержание связанного списка, за исключением одного случая: итерация по коллекциям представлений класса LinkedHashMap требует времени, пропорционального размеру карты, независимо от её ёмкости. Итерация по коллекции HashMap, вероятно, будет более дорогой, требуя времени, пропорционального её ёмкости.
Связанная хеш-карта имеет два параметра, которые влияют на её производительность: начальная ёмкость и коэффициент заполнения. Они определяются точно так же, как и для класса HashMap. Однако, штраф за выбор чрезмерно высокого значения начальной ёмкости для этого класса меньше, чем для класса HashMap, поскольку время итерации для этого класса не зависит от ёмкости.
Обратите внимание, что эта реализация не синхронизирована. Если несколько потоков одновременно обращаются к связанной хеш-карте, и хотя бы один из потоков изменяет карту структурно, она должна быть синхронизирована внешним образом. Это обычно достигается синхронизацией на некотором объекте, естественным образом инкапсулирующем карту. Если такого объекта не существует, карта должна быть «обёрнута» с помощью метода Collections.synchronizedMap. Лучше всего это сделать при создании, чтобы предотвратить случайный несинхронизированный доступ к карте:
Map m = Collections.synchronizedMap(new LinkedHashMap(...));Структурное изменение — это любая операция, добавляющая или удаляющая одно или несколько сопоставлений или, в случае упорядоченных по доступу связанных хеш-карт, влияющая на порядок итерации. В картах с порядком вставки простое изменение значения, связанного с ключом, уже содержащимся в карте, не является структурным изменением. В картах с порядком доступа простое запросы карты с помощью
get является структурным изменением. ) Итераторы, возвращаемые методом iterator коллекций, возвращаемых методами представления коллекции этого класса, являются быстропроверяющими: если карта изменяется структурно в любой момент после создания итератора, каким-либо способом, кроме метода remove самого итератора, итератор будет выбрасывать исключение ConcurrentModificationException. Таким образом, при одновременном изменении итератор быстро и чисто завершается, а не рискует произвольным непредсказуемым поведением в неопределённый момент времени в будущем.
Обратите внимание, что быстрое обнаружение несоответствий (fail-fast) итератора не может быть гарантировано, поскольку, в общем случае, невозможно сделать какие-либо гарантии при несинхронизированном одновременном изменении. Итераторы с быстрой проверкой соответствия выбрасывают исключения ConcurrentModificationException на основе наилучших усилий. Поэтому неправильно было бы писать программу, зависящую от этого исключения для её корректности: поведение быстропроверяющих итераторов следует использовать только для обнаружения ошибок.
Разделители, возвращаемые методом spliterator коллекций, возвращаемых методами представления коллекции всех методов этого класса, создаются из итераторов соответствующих коллекций.
Этот класс является членом Java Collections Framework.
- Implementation Note:
- Разделители, возвращаемые методом spliterator коллекций, возвращаемых методами представления коллекции всех методов этого класса, создаются из итераторов соответствующих коллекций.
- Since:
- 1.4
- See Also:
Краткое описание вложенных классов
Вложенные классы/интерфейсы, объявленные в классе java.util.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 значений, содержащихся в этой карте. |
Методы, объявленные в классе java.util.HashMap
clear, clone, compute, computeIfAbsent, computeIfPresent, containsKey, isEmpty, merge, newHashMap, put, putAll, remove, size
Методы, объявленные в классе java.util.AbstractMap
equals, hashCode, toString
Методы, объявленные в классе java.lang.Object
finalize, getClass, notify, notifyAll, wait, wait, wait
Методы, объявленные в интерфейсе java.util.Map
compute, computeIfAbsent, computeIfPresent, containsKey, equals, forEach, getOrDefault, hashCode, isEmpty, merge, put, putAll, putIfAbsent, remove, remove, replace, replace, replaceAll, size
Методы, объявленные в интерфейсе java.util.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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/util/LinkedHashMap.html