Spec-Zone.ru › OpenJDK 17

Класс 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>
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<String, Integer> m) {
         Map<String, Integer> copy = new LinkedHashMap<>(m);
         ...
     }
 
Этот метод особенно полезен, если модуль принимает карту на вход, копирует её, а затем возвращает результаты, порядок которых определяется порядком этой копии. (Клиенты, как правило, ценят возврат элементов в том же порядке, в котором они были представлены.)

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

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

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

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

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

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

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

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

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

Этот класс является частью Java Collections Framework.

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

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

Вложенные классы/интерфейсы, объявленные в классе 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 ключей, содержащихся в этой карте.
protected boolean removeEldestEntry(Map.Entry<K,V> eldest)
Возвращает true, если эта карта должна удалить свой самый старый элемент.
Collection<V> values()
Возвращает представление Collection значений, содержащихся в этой карте.

Методы, объявленные в классе 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

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)

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

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, 2021, 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/17/docs/api/java.base/java/util/LinkedHashMap.html

Spec-Zone.ru

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