Класс 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
- См. также:
Краткое описание вложенных классов
Вложенные классы/интерфейсы, объявленные в классе 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<Map.Entry<K, |
entrySet() |
Возвращает представление Set отображений, содержащихся в этой карте. |
V |
get |
Возвращает значение, которому сопоставлен указанный ключ, или null, если эта карта не содержит сопоставления для ключа. |
Set<K> |
keySet() |
Возвращает представление Set ключей, содержащихся в этой карте. |
protected boolean |
removeEldestEntry |
Возвращает 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если в этой карте нет отображения для ключа - См. также:
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