Spec-Zone.ru › OpenJDK 24

Класс LinkedHashMap<K,V>

java.lang.Object
java.util.AbstractMap<K,V>
java.util.HashMap<K,V>
java.util.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:
  • Object.hashCode()
  • Collection
  • Map
  • HashMap
  • TreeMap
  • Hashtable
  • Serialized Form

Краткое описание вложенных классов

Вложенные классы/интерфейсы, объявленные в классе java.util.AbstractMap

AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K,V>

Краткое описание конструкторов

Конструктор Описание
LinkedHashMap()
Создаёт пустой экземпляр LinkedHashMap с упорядочиванием по вставкам с начальной ёмкостью по умолчанию (16) и коэффициентом заполнения (0.75).
LinkedHashMap(int initialCapacity)
Создаёт пустой экземпляр LinkedHashMap с упорядочиванием по вставкам, заданной начальной ёмкостью и коэффициентом заполнения по умолчанию (0.75).
LinkedHashMap(int initialCapacity, float loadFactor)
Создаёт пустой экземпляр LinkedHashMap с упорядочиванием по вставкам, заданной начальной ёмкостью и коэффициентом заполнения.
LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
Создаёт пустой экземпляр LinkedHashMap с заданной начальной ёмкостью, коэффициентом заполнения и режимом упорядочивания.
LinkedHashMap(Map<? extends K, ? extends V> m)
Создаёт экземпляр LinkedHashMap с упорядочиванием по вставкам и теми же отображениями, что и в указанной карте.

Краткое описание методов

Модификатор и тип Метод Описание
void clear()
Удаляет все отображения из этой карты.
boolean containsValue(Object value)
Возвращает значение true, если эта карта сопоставляет одну или несколько ключей указанному значению.
Set<Map.Entry<K,V>> entrySet()
Возвращает представление Set отображений, содержащихся в этой карте.
V get(Object key)
Возвращает значение, которому сопоставлен указанный ключ, или null, если в этой карте нет отображения для ключа.
Set<K> keySet()
Возвращает представление Set ключей, содержащихся в этой карте.
static <K,V> LinkedHashMap<K,V> newLinkedHashMap(int numMappings)
Создаёт новую, пустую, LinkedHashMap с упорядочиванием по вставкам, подходящую для ожидаемого количества отображений.
V putFirst(K k, V v)
Вставляет заданное отображение в карту, если оно ещё не присутствует, или заменяет значение отображения, если оно уже присутствует (необязательная операция).
V putLast(K k, V v)
Вставляет заданное отображение в карту, если оно ещё не присутствует, или заменяет значение отображения, если оно уже присутствует (необязательная операция).
protected boolean removeEldestEntry(Map.Entry<K,V> eldest)
Возвращает значение true, если эта карта должна удалить свою самую старую запись.
SequencedMap<K,V> reversed()
Возвращает упорядоченное в обратном порядке представление вид этой карты.
SequencedSet<Map.Entry<K,V>> sequencedEntrySet()
Возвращает представление SequencedSet набора отображений entrySet этой карты.
SequencedSet<K> sequencedKeySet()
Возвращает представление SequencedSet набора ключей keySet этой карты.
SequencedCollection<V> sequencedValues()
Возвращает представление SequencedCollection набора значений values этой карты.
Collection<V> 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 может быть использована для различения этих двух случаев.

Определено в:
get в интерфейсе Map<K,V>
Переопределяет:
get в классе HashMap<K,V>
Параметры:
key - ключ, связанное значение которого нужно вернуть
Возвращает:
значение, которому сопоставлен указанный ключ, или null, если эта карта не содержит отображения для ключа
См. также:
  • HashMap.put(Object, Object)

clear

public void clear()
Удаляет все отображения из этой карты. Карта будет пустой после возврата этого вызова.
Определено в:
clear в интерфейсе Map<K,V>
Переопределяет:
clear в классе HashMap<K,V>

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.
Определено в:
keySet в интерфейсе Map<K,V>
Переопределяет:
keySet в классе HashMap<K,V>
Возвращает:
представление множества ключей, содержащихся в этой карте

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.
Указано в:
values в интерфейсе Map<K,V>
Переопределяет:
values в классе HashMap<K,V>
Возвращает:
вид содержащихся в этом отображении значений

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.
Указано в:
entrySet в интерфейсе Map<K,V>
Переопределяет:
entrySet в классе HashMap<K,V>
Возвращает:
вид множества отображений, содержащихся в этом отображении

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)
Создаёт новое пустое вставленное упорядоченное отображение LinkedHashMap, подходящее для ожидаемого количества отображений. Возвращаемое отображение использует коэффициент загрузки по умолчанию 0,75, и его начальная ёмкость, как правило, достаточна для добавления ожидаемого количества отображений без изменения размера отображения.
Тип параметров:
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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API