Spec-Zone.ru › OpenJDK 25

Класс LinkedHashMap<K,V>

java.lang.Object
java.util.AbstractMap<K,V>
java.util.HashMap<K,V>
java.util.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
См. также:
  • Object.hashCode()
  • Collection
  • Map
  • HashMap
  • TreeMap
  • Hashtable
  • Сериализованная форма

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

Вложенные классы/интерфейсы, объявленные в классе 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 значений, содержащихся в этой карте.

Методы, объявленные в классе HashMap

clear, clone, compute, computeIfAbsent, computeIfPresent, containsKey, isEmpty, merge, newHashMap, put, putAll, remove, size

Методы, объявленные в классе AbstractMap

equals, hashCode, toString

Методы, объявленные в классе Object

finalize, getClass, notify, notifyAll, wait, wait, wait

Методы, объявленные в интерфейсе 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.

Определено в:
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

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, обзоры концепций, определения терминов, обходные решения и работающие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторское право © 1993, 2025, Oracle и/или ее аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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

Spec-Zone.ru

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