Класс LinkedHashMap<K,​V>

Параметры типа:
K - тип ключей, поддерживаемых этой картой
V - тип сопоставленных значений
Все реализованные интерфейсы:
Serializable, Cloneable, Map<K,​V>
public class LinkedHashMap<K,V>
extends HashMap<K,​V>
implements Map<K,​V>

Реализация хэш-таблицы и связанного списка интерфейса Map, с предсказуемым порядком итерации. Эта реализация отличается от HashMap тем, что она поддерживает двусвязный список, проходящий через все свои элементы. Этот связанный список определяет порядок итерации, который обычно является порядком вставки ключей в карту (порядок вставки). Обратите внимание, что порядок вставки не изменяется, если ключ перевставлен в карту. (Ключ k перевставляется в карту m , если m.put(k, v) вызывается, когда m.containsKey(k) вернёт true непосредственно перед вызовом.)

Эта реализация избавляет клиентов от неопределённого, в целом хаотичного порядка, предоставляемого классом HashMap (и Hashtable), не неся при этом повышенных затрат, связанных с TreeMap. Её можно использовать для создания копии карты, имеющей тот же порядок, что и оригинал, независимо от реализации исходной карты:

void foo(Map m) {
         Map copy = new LinkedHashMap(m);
         ...
     }
Этот приём особенно полезен, если модуль принимает карту на вход, копирует её, а затем возвращает результаты, порядок которых определяется порядком копии. (Клиенты, как правило, ценят получение результатов в том же порядке, в котором они были представлены.)

Предоставляется специальный constructor для создания связанной хэш-карты, порядок итерации которой соответствует порядку последнего доступа к её элементам, от наименее до наиболее часто используемого (порядок доступа). Такая карта подходит для создания кэшей LRU. Вызов методов put, putIfAbsent, get, getOrDefault, compute, computeIfAbsent, computeIfPresent, или merge приводит к доступу к соответствующему элементу (если он существует после завершения вызова). Методы replace приводят к доступу к элементу только в случае замены значения. Метод putAll генерирует один доступ к элементу для каждого отображения в указанной карте, в том порядке, в котором пары ключ-значение предоставляются итератором множества элементов указанной карты. Никакие другие методы не генерируют обращений к элементам. В частности, операции над представлениями коллекций не влияют на порядок итерации базовой карты.

Метод removeEldestEntry(Map.Entry) можно переопределить для реализации политики автоматического удаления устаревших отображений при добавлении новых отображений в карту.

Этот класс предоставляет все необязательные Map операции и разрешает использование null-элементов. Как и HashMap, он обеспечивает постоянное время выполнения для основных операций (add, contains и remove ), предполагая, что хэш-функция правильно распределяет элементы по корзинам. Производительность, вероятно, будет немного ниже, чем у HashMap, из-за дополнительных расходов на поддержание связанного списка, за одним исключением: итерация по представлениям коллекций LinkedHashMap требует времени, пропорционального размеру карты, независимо от её ёмкости. Итерация по HashMap будет, вероятно, более дорогой, потребовав времени, пропорционального её ёмкости.

Связанная хэш-карта имеет два параметра, влияющих на её производительность: начальная ёмкость и коэффициент заполнения. Они определяются точно так же, как для HashMap. Однако штраф за выбор слишком большого значения для начальной ёмкости менее значителен для этого класса, чем для HashMap, поскольку время итерации для этого класса не зависит от ёмкости.

Обратите внимание, что эта реализация не синхронизирована. Если несколько потоков одновременно обращаются к связанной хэш-карте, и хотя бы один из потоков изменяет карту структурно, она должна быть синхронизирована внешне. Обычно это достигается путём синхронизации по некоторому объекту, который естественным образом инкапсулирует карту. Если такого объекта не существует, карту следует «обернуть» с помощью метода Collections.synchronizedMap. Лучше всего это сделать при создании, чтобы предотвратить случайный несинхронизированный доступ к карте:

Map m = Collections.synchronizedMap(new LinkedHashMap(...));
Структурное изменение — это любая операция, добавляющая или удаляющая одно или несколько отображений, или, в случае связанных хэш-карт с порядком доступа, влияющая на порядок итерации. В связанных хэш-картах с порядком вставки простое изменение значения, связанного с ключом, уже содержащимся в карте, не является структурным изменением. В связанных хэш-картах с порядком доступа простое запросить карту с помощью get является структурным изменением.)

Итераторы, возвращаемые методом iterator методов представлений коллекций всех методов представлений коллекций этого класса, являются быстродействующими: если карта структурно изменяется в любой момент после создания итератора, любым способом, кроме метода самого итератора remove метод, итератор выбросит исключение ConcurrentModificationException. Таким образом, при одновременном изменении итератор быстро и чётко завершает свою работу, вместо того чтобы рисковать произвольным, непредсказуемым поведением в неопределённое время в будущем.

Обратите внимание, что быстродействие итератора не гарантируется, так как, как правило, невозможно дать какие-либо гарантии в случае несинхронизированного одновременного изменения. Быстродействующие итераторы выбрасывают ConcurrentModificationException в лучшем случае. Следовательно, неправильно писать программу, которая полагается на это исключение для своей корректности: быстродействие итераторов следует использовать только для обнаружения ошибок.

Сплитераторы, возвращаемые методом spliterator методов представлений коллекций всех методов представлений коллекций этого класса, являются поздне-связываемыми, быстродействующими и дополнительно сообщают о Spliterator.ORDERED.

Этот класс является членом Java Collections Framework.

Примечание реализации:
Сплитераторы, возвращаемые методом spliterator методов представлений коллекций всех методов представлений коллекций этого класса, создаются из итераторов соответствующих коллекций.
С:
1.4
См. также:
Object.hashCode(), Collection, Map, HashMap, TreeMap, Hashtable, Формат сериализации

Вложенные классы

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

Методы

Модификатор и тип Метод Описание
boolean containsValue​(Object value)

Возвращает true , если эта карта отображает один или несколько ключей на указанное значение.

Set<Map.Entry<K,​V>> entrySet()

Возвращает представление множества отображений, содержащихся в этой карте.

V get​(Object key)

Возвращает значение, которому сопоставлен указанный ключ, или null , если в этой карте нет сопоставления для ключа.

Set<K> keySet()

Возвращает представление множества ключей, содержащихся в этой карте.

protected boolean removeEldestEntry​(Map.Entry<K,​V> eldest)

Возвращает true , если эта карта должна удалить свой самый старый элемент.

Collection<V> values()

Возвращает представление коллекции значений, содержащихся в этой карте.

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

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

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

equals, hashCode, toString

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

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

Методы, объявленные в интерфейсе java.util.Map

clear, compute, computeIfAbsent, computeIfPresent, containsKey, equals, forEach, getOrDefault, hashCode, isEmpty, merge, put, putAll, putIfAbsent, remove, remove, replace, replace, replaceAll, size

Конструкторы

LinkedHashMap

public LinkedHashMap(int initialCapacity,
                     float loadFactor)

Создаёт пустой экземпляр с упорядочиванием по вставке LinkedHashMap с указанной начальной ёмкостью и коэффициентом заполнения.

Параметры:
initialCapacity - начальная ёмкость
loadFactor - коэффициент заполнения
Исключения:
IllegalArgumentException - если начальная ёмкость отрицательная или коэффициент заполнения не положительный

LinkedHashMap

public LinkedHashMap(int initialCapacity)

Создаёт пустой экземпляр с упорядочиванием по вставке LinkedHashMap с указанной начальной ёмкостью и стандартным коэффициентом заполнения (0.75).

Параметры:
initialCapacity - начальная ёмкость
Исключения:
IllegalArgumentException - если начальная ёмкость отрицательная

LinkedHashMap

public LinkedHashMap()

Создаёт пустой экземпляр с упорядочиванием по вставке LinkedHashMap со стандартной начальной ёмкостью (16) и коэффициентом заполнения (0.75).

LinkedHashMap

public LinkedHashMap(Map<? extends K,​? extends V> m)

Создаёт экземпляр с упорядочиванием по вставке LinkedHashMap с теми же отображениями, что и у указанной карты. Экземпляр создаётся со стандартным коэффициентом заполнения (0.75) и начальной ёмкостью, достаточной для хранения отображений в указанной карте.

Параметры:
m - карта, отображения которой необходимо поместить в эту карту
Исключения:
NullPointerException - если указанная карта равна null

LinkedHashMap

public LinkedHashMap(int initialCapacity,
                     float loadFactor,
                     boolean accessOrder)

Создаёт пустой LinkedHashMap экземпляр с указанной начальной ёмкостью, коэффициентом заполнения и режимом упорядочивания.

Параметры:
initialCapacity - начальная ёмкость
loadFactor - коэффициент заполнения
accessOrder - режим упорядочивания - true для упорядочивания по порядку доступа, false для упорядочивания по порядку вставки
Исключения:
IllegalArgumentException - если начальная ёмкость отрицательная или коэффициент заполнения не положительный

Методы

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)

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>
Возвращает:
представление множества ключей, содержащихся в этой карте

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>
Возвращает:
представление значений, содержащихся в этой карте

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>
Возвращает:
представление множества отображений, содержащихся в этой карте

© 1993, 2020, 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/11/docs/api/java.base/java/util/LinkedHashMap.html

Spec-Zone .ru
спецификации, руководства, описания, API