Spec-Zone.ru › OpenJDK 8

Класс 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 с порядком вставки по умолчанию (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()

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

void forEach(BiConsumer<? super K,? super V> action)

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

V get(Object key)

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

V getOrDefault(Object key, V defaultValue)

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

Set<K> keySet()

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

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

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

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()

Удаляет все отображения из этой карты. Карта будет пустой после возврата этого вызова.

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

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.

Spec-Zone.ru

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