Класс 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- тип сопоставленных значений
- All Implemented Interfaces:
- 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, поскольку время итерации для этого класса не зависит от емкости.
Обратите внимание, что эта реализация не синхронизирована. Если несколько потоков одновременно обращаются к связанной хэш-карте и хотя бы один из потоков структурно изменяет карту, она должна быть синхронизирована внешне. Обычно это достигается синхронизацией на каком-либо объекте, естественным образом encapsulating карту. Если такого объекта нет, карта должна быть "обёрнута" с помощью метода Collections.synchronizedMap. Лучше всего это сделать во время создания, чтобы избежать случайного несинхронизированного доступа к карте:
Map m = Collections.synchronizedMap(new LinkedHashMap(...));Структурное изменение — это любая операция, добавляющая или удаляющая одно или несколько отображений или, в случае упорядоченных по доступу связанных хэш-карт, влияющая на порядок итерации. В картах с порядком вставки простое изменение значения, связанного с ключом, уже содержащимся в карте, не является структурным изменением. В картах с порядком доступа простое запросы карты с
get являются структурным изменением. ) Итераторы, возвращаемые методом iterator коллекций, возвращаемых всеми методами представления-коллекции этого класса, являются быстропроверяющими: если карта структурно изменяется в любое время после создания итератора, каким-либо способом, кроме использования собственного метода remove итератора, итератор выбросит исключение ConcurrentModificationException. Таким образом, при одновременном изменении итератор быстро и безупречно завершает работу, а не рискует произвольным, непредсказуемым поведением в неопределенное время в будущем.
Обратите внимание, что поведение быстропроверяющего итератора не может быть гарантировано, так как, вообще говоря, невозможно дать какие-либо гарантии при одновременном несинхронизированном изменении. Итераторы, быстро проверяющие на ошибки, выбрасывают ConcurrentModificationException в лучшем случае. Поэтому было бы неправильно писать программу, которая полагалась бы на это исключение для корректности: поведение быстропроверяющего итератора следует использовать только для обнаружения ошибок.
Spliterators, возвращаемые методом spliterator коллекций, возвращаемых методами представления-коллекций всех методов представления этого класса, являются позднесвязанными, быстропроверяющими и дополнительно сообщают о Spliterator.ORDERED.
Этот класс является членом Java Collections Framework.
- Implementation Note:
- Spliterators, возвращаемые методом 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(int initialCapacity) Создаёт пустой экземпляр |
LinkedHashMap(int initialCapacity,
float loadFactor) Создаёт пустой экземпляр |
LinkedHashMap(int initialCapacity,
float loadFactor,
boolean accessOrder) Создаёт пустой экземпляр |
LinkedHashMap(Map<? extends K,? extends V> m) Создаёт экземпляр |
Краткое описание методов
| Модификатор и тип | Метод и описание |
|---|---|
void |
clear() Удаляет все отображения из этой карты. |
boolean |
containsValue(Object value) Возвращает |
Set<Map.Entry<K,V>> |
entrySet() Возвращает представление-множество отображений, содержащихся в этой карте. |
void |
forEach(BiConsumer<? super K,? super V> action) Выполняет заданное действие для каждого элемента в этой карте до тех пор, пока все элементы не будут обработаны или действие не выбросит исключение. |
V |
get(Object key) Возвращает значение, которому сопоставлен указанный ключ, или |
V |
getOrDefault(Object key,
V defaultValue) Возвращает значение, которому сопоставлен указанный ключ, или |
Set<K> |
keySet() Возвращает представление-множество ключей, содержащихся в этой карте. |
protected boolean |
removeEldestEntry(Map.Entry<K,V> eldest) Возвращает |
void |
replaceAll(BiFunction<? super K,? super V,? extends V> function) Заменяет значение каждого элемента результатом вызова заданной функции для этого элемента, до тех пор пока все элементы не будут обработаны или функция не выбросит исключение. |
Collection<V> |
values() Возвращает представление-коллекцию значений, содержащихся в этой карте. |
Методы, унаследованные от класса java.util.HashMap
clone, compute, computeIfAbsent, computeIfPresent, containsKey, isEmpty, merge, put, putAll, putIfAbsent, remove, remove, replace, replace, 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, hashCode, isEmpty, merge, put, putAll, putIfAbsent, remove, remove, replace, replace, 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)
getOrDefault
public V getOrDefault(Object key,
V defaultValue) Возвращает значение, которому сопоставлен указанный ключ, или defaultValue если эта карта не содержит отображения для ключа.
- Определено в:
-
getOrDefaultв интерфейсеMap<K,V> - Переопределено в:
-
getOrDefaultв классеHashMap<K,V> - Параметры:
-
key- ключ, связанное значение которого требуется вернуть -
defaultValue- значение по умолчанию для ключа - Возвращает:
- значение, которому сопоставлен указанный ключ, или
defaultValueесли эта карта не содержит отображения для ключа
clear
public void clear()
Удаляет все отображения из этой карты. Карта будет пустой после возврата этого вызова.
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> - Возвращает:
- представление множества отображений, содержащихся в этой карте
forEach
public void forEach(BiConsumer<? super K,? super V> action)
Описание скопировано из интерфейса: Map
Выполняет заданное действие для каждой записи в этом словаре до тех пор, пока все записи не будут обработаны или действие не вызовет исключение. Если не указано иначе реализующим классом, действия выполняются в порядке итерации набора записей (если порядок итерации указан). Исключение, сгенерированное действием, пересылается вызывающей стороне.
- Указано в:
-
forEachв интерфейсеMap<K,V> - Переопределяет:
-
forEachв классеHashMap<K,V> - Параметры:
-
action- действие, которое должно быть выполнено для каждой записи
replaceAll
public void replaceAll(BiFunction<? super K,? super V,? extends V> function)
Описание скопировано из интерфейса: Map
Заменяет значение каждой записи результатом вызова заданной функции для этой записи до тех пор, пока все записи не будут обработаны или функция не выбросит исключение. Исключение, сгенерированное функцией, пересылается вызывающей стороне.
- Указано в:
-
replaceAllв интерфейсеMap<K,V> - Переопределяет:
-
replaceAllв классеHashMap<K,V> - Параметры:
-
function- функция, применяемая к каждой записи
© 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.