Класс WeakHashMap<K, V>
- Параметры типа:
K— тип ключей, хранящихся в этой картеV— тип отображаемых значений
- Все реализуемые интерфейсы:
Map<K,V>
public class WeakHashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>
Map на основе хеш-таблицы со слабыми ключами. Запись в WeakHashMap автоматически удаляется, когда её ключ перестаёт использоваться обычным образом. Точнее, наличие отображения для заданного ключа не препятствует сборщику мусора отбросить этот ключ, то есть сделать его доступным для финализации, выполнить финализацию и затем освободить память. После того как ключ отброшен, соответствующая ему запись фактически удаляется из карты, поэтому этот класс ведёт себя несколько иначе, чем другие реализации Map. Поддерживаются как значения null, так и ключ null. Производительность этого класса аналогична производительности класса HashMap, а параметры эффективности — начальная ёмкость и коэффициент загрузки — те же.
Как и большинство классов коллекций, этот класс не синхронизирован. Синхронизированный WeakHashMap можно создать с помощью метода Collections.synchronizedMap.
Этот класс предназначен главным образом для использования с объектами-ключами, чьи методы equals проверяют идентичность объектов с помощью оператора ==. После того как такой ключ отброшен, его невозможно создать заново, поэтому позднее нельзя выполнить поиск этого ключа в WeakHashMap и неожиданно обнаружить, что соответствующая запись удалена. Этот класс будет корректно работать и с объектами-ключами, чьи методы equals не основаны на идентичности объектов, например с экземплярами String. Однако при использовании таких воссоздаваемых объектов-ключей автоматическое удаление записей WeakHashMap, чьи ключи были отброшены, может привести к путанице.
Поведение класса WeakHashMap отчасти зависит от действий сборщика мусора, поэтому для этого класса не выполняются некоторые знакомые инварианты Map (хотя их соблюдение и не требуется). Поскольку сборщик мусора может отбросить ключи в любой момент, WeakHashMap может вести себя так, будто неизвестный поток незаметно удаляет записи. В частности, даже если выполнить синхронизацию по экземпляру WeakHashMap и не вызывать ни одного из его методов-мутаторов, со временем метод size может возвращать всё меньшие значения; метод isEmpty может сначала вернуть false, а затем true; метод containsKey может вернуть true, а позднее — false для заданного ключа; метод get может вернуть значение для заданного ключа, а позднее вернуть null; метод put может вернуть null, а метод remove — вернуть false для ключа, который ранее, как казалось, присутствовал в карте; последовательные обходы набора ключей, коллекции значений и набора записей могут возвращать всё меньше элементов.
Каждый объект-ключ в WeakHashMap хранится косвенно, как референт слабой ссылки. Поэтому ключ автоматически удаляется только после того, как сборщик мусора очистит слабые ссылки на него — как внутри карты, так и за её пределами.
Примечание по реализации: Объекты-значения в WeakHashMap удерживаются обычными сильными ссылками. Поэтому следует следить за тем, чтобы объекты-значения не ссылались сильно на собственные ключи — прямо или косвенно, — поскольку это помешает удалению ключей. Обратите внимание, что объект-значение может косвенно ссылаться на свой ключ через сам WeakHashMap; то есть объект-значение может сильно ссылаться на другой объект-ключ, связанный с объектом-значением, который, в свою очередь, сильно ссылается на ключ первого объекта-значения. Если значения в карте не зависят от того, что карта удерживает на них сильные ссылки, эту проблему можно решить, обернув сами значения в WeakReferences перед добавлением, например так: m.put(key, new WeakReference(value)), а затем извлекая их при каждом вызове get.
Итераторы, возвращаемые методом iterator коллекций, полученных всеми методами представления коллекций этого класса, являются быстро отказывающими: если после создания итератора структура карты изменится каким-либо образом, кроме вызова собственного метода remove итератора, итератор выбросит исключение ConcurrentModificationException. Таким образом, при конкурентном изменении итератор быстро и аккуратно завершает работу, а не рискует в неопределённый момент в будущем повести себя произвольным и недетерминированным образом.
Обратите внимание, что гарантировать быстрое обнаружение изменений итератором невозможно, поскольку, вообще говоря, нельзя дать строгих гарантий при несинхронизированном конкурентном изменении. Быстро отказывающие итераторы выбрасывают ConcurrentModificationException по возможности. Поэтому было бы неправильно писать программу, корректность которой зависит от этого исключения: быстрое обнаружение изменений итераторами следует использовать только для выявления ошибок.
Этот класс входит в состав Java Collections Framework.
- Начиная с версии:
- 1.2
- См. также:
Краткое описание вложенных классов
Вложенные классы и интерфейсы, объявленные в классе AbstractMap
AbstractMap.SimpleEntry<K, V>, AbstractMap.SimpleImmutableEntry<K, V> | Модификатор и тип | Класс | Описание |
|---|---|---|
static class |
AbstractMap.SimpleEntry<K, |
Запись, содержащая ключ и значение. |
static class |
AbstractMap.SimpleImmutableEntry<K, |
Неизменяемая запись, содержащая ключ и значение. |
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
WeakHashMap() |
Создаёт новую пустую WeakHashMap с начальной ёмкостью по умолчанию (16) и коэффициентом загрузки по умолчанию (0.75). |
WeakHashMap |
Создаёт новую пустую WeakHashMap с заданной начальной ёмкостью и коэффициентом загрузки по умолчанию (0.75). |
WeakHashMap |
Создаёт новую пустую WeakHashMap с заданными начальной ёмкостью и коэффициентом загрузки. |
WeakHashMap |
Создаёт новую WeakHashMap с теми же отображениями, что и в указанной карте. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
clear() |
Удаляет все отображения из этой карты. |
boolean |
containsKey |
Возвращает true, если эта карта содержит отображение для указанного ключа. |
boolean |
containsValue |
Возвращает true, если эта карта сопоставляет одному или нескольким ключам указанное значение. |
Set |
entrySet() |
Возвращает представление содержащихся в этой карте отображений в виде Set. |
V |
get |
Возвращает значение, сопоставленное указанному ключу, или null, если в этой карте нет отображения для данного ключа. |
boolean |
isEmpty() |
Возвращает true, если эта карта не содержит отображений «ключ-значение». |
Set |
keySet() |
Возвращает представление содержащихся в этой карте ключей в виде Set. |
static <K, |
newWeakHashMap |
Создаёт новую пустую WeakHashMap, подходящую для ожидаемого количества отображений. |
V |
put |
Сопоставляет указанное значение указанному ключу в этой карте. |
void |
putAll |
Копирует все отображения из указанной карты в эту карту. |
V |
remove |
Удаляет отображение для ключа из этой слабой хеш-карты, если оно существует. |
int |
size() |
Возвращает количество отображений «ключ-значение» в этой карте. |
Collection |
values() |
Возвращает представление содержащихся в этой карте значений в виде Collection. |
Методы, объявленные в классе AbstractMap
clone, equals, hashCode, toString | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Возвращает поверхностную копию этого экземпляра AbstractMap: сами ключи и значения не клонируются. |
boolean |
equals |
Сравнивает указанный объект с этой картой на равенство. |
int |
hashCode() |
Возвращает хеш-код этой карты. |
String |
toString() |
Возвращает строковое представление этой карты. |
Методы, объявленные в классе Object
finalize, getClass, notify, notifyAll, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected void |
finalize() |
Устарело, будет удалено: этот элемент API подлежит удалению в будущей версии. Финализация объявлена устаревшей и подлежит удалению в одном из следующих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно в результате уведомления или прерывания. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно в результате уведомления или прерывания, либо до истечения заданного промежутка реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно в результате уведомления или прерывания, либо до истечения заданного промежутка реального времени. |
Методы, объявленные в интерфейсе Map
compute, computeIfAbsent, computeIfPresent, forEach, getOrDefault, merge, putIfAbsent, remove, replace, replace, replaceAll | Модификатор и тип | Метод | Описание |
|---|---|---|
default V |
compute |
Пытается вычислить отображение для указанного ключа и его текущего сопоставленного значения либо null, если текущее отображение отсутствует (необязательная операция). |
default V |
computeIfAbsent |
Если указанному ключу ещё не сопоставлено значение (или ему сопоставлено null), пытается вычислить его значение с помощью заданной функции отображения и добавляет его в эту карту, если результат не равен null (необязательная операция). |
default V |
computeIfPresent |
Если для указанного ключа имеется ненулевое значение, пытается вычислить новое отображение на основе ключа и текущего сопоставленного ему значения (необязательная операция). |
default void |
forEach |
Выполняет заданное действие для каждой записи этой карты, пока не будут обработаны все записи или действие не выбросит исключение. |
default V |
getOrDefault |
Возвращает значение, сопоставленное указанному ключу, или defaultValue, если в этой карте нет отображения для данного ключа. |
default V |
merge |
Если указанному ключу ещё не сопоставлено значение или ему сопоставлено null, сопоставляет ему заданное ненулевое значение (необязательная операция). |
default V |
putIfAbsent |
Если указанному ключу ещё не сопоставлено значение (или ему сопоставлено null), сопоставляет ему заданное значение и возвращает null; в противном случае возвращает текущее значение (необязательная операция). |
default boolean |
remove |
Удаляет запись для указанного ключа, только если в данный момент ему сопоставлено указанное значение (необязательная операция). |
default V |
replace |
Заменяет запись для указанного ключа, только если в данный момент ему сопоставлено какое-либо значение (необязательная операция). |
default boolean |
replace |
Заменяет запись для указанного ключа, только если в данный момент ему сопоставлено указанное значение (необязательная операция). |
default void |
replaceAll |
Заменяет значение каждой записи результатом вызова заданной функции для этой записи, пока не будут обработаны все записи или функция не выбросит исключение (необязательная операция). |
Подробное описание конструкторов
WeakHashMap
public WeakHashMap(int initialCapacity, float loadFactor)
WeakHashMap с заданной начальной емкостью и заданным коэффициентом загрузки.- Примечание API:
- Чтобы создать
WeakHashMapс начальной емкостью, рассчитанной на ожидаемое количество отображений, используйтеnewWeakHashMap. - Параметры:
-
initialCapacity— начальная емкостьWeakHashMap -
loadFactor— коэффициент загрузкиWeakHashMap - Исключения:
-
IllegalArgumentException— если начальная емкость отрицательна или коэффициент загрузки неположителен.
WeakHashMap
public WeakHashMap(int initialCapacity)
WeakHashMap с заданной начальной емкостью и коэффициентом загрузки по умолчанию (0.75).- Примечание API:
- Чтобы создать
WeakHashMapс начальной емкостью, рассчитанной на ожидаемое количество отображений, используйтеnewWeakHashMap. - Параметры:
-
initialCapacity— начальная емкостьWeakHashMap - Исключения:
-
IllegalArgumentException— если начальная емкость отрицательна
WeakHashMap
public WeakHashMap()
WeakHashMap с начальной емкостью по умолчанию (16) и коэффициентом загрузки по умолчанию (0.75).WeakHashMap
public WeakHashMap(Map<? extends K, ? extends V> m)
WeakHashMap с теми же отображениями, что и указанная карта. WeakHashMap создается с коэффициентом загрузки по умолчанию (0.75) и начальной емкостью, достаточной для хранения отображений указанной карты.- Параметры:
-
m— карта, отображения которой необходимо поместить в эту карту - Исключения:
-
NullPointerException— если указанная карта равна null - С версии:
- 1.3
Подробное описание методов
size
public int size()
isEmpty
public boolean isEmpty()
true, если эта карта не содержит отображений ключ-значение. Это моментальный снимок, который может не учитывать необработанные записи, удаляемые до следующей попытки доступа, поскольку на них больше нет ссылок.get
public V get(Object key)
null, если в этой карте нет отображения для ключа. Формально, если эта карта содержит отображение от ключа k к значению v такое, что Objects.equals(key, k), этот метод возвращает v; в противном случае он возвращает null. (Такое отображение может быть не более чем одно.)
Возвращаемое значение null не обязательно означает, что в карте нет отображения для ключа; также возможно, что карта явно сопоставляет ключ со значением null. Операцию containsKey можно использовать, чтобы различить эти два случая.
containsKey
public boolean containsKey(Object key)
true, если эта карта содержит отображение для указанного ключа.- Определен в:
-
containsKeyв интерфейсеMap<K,V> - Переопределяет:
-
containsKeyв классеAbstractMap<K,V> - Параметры:
-
key— ключ, наличие которого в этой карте необходимо проверить - Возвращает:
-
true, если дляkeyимеется отображение; в противном случае —false
put
public V put(K key, V value)
- Определен в:
-
putв интерфейсеMap<K,V> - Переопределяет:
-
putв классеAbstractMap<K,V> - Параметры:
-
key— ключ, с которым необходимо связать указанное значение. -
value— значение, которое необходимо связать с указанным ключом. - Возвращает:
- предыдущее значение, связанное с
key, илиnull, если дляkeyне было отображения. (Возвращаемое значениеnullтакже может означать, что ранее карта связывалаnullсо значениемkey.)
putAll
public void putAll(Map<? extends K, ? extends V> m)
- Определен в:
-
putAllв интерфейсеMap<K,V> - Переопределяет:
-
putAllв классеAbstractMap<K,V> - Параметры:
-
m— отображения, которые необходимо сохранить в этой карте. - Исключения:
-
NullPointerException— если указанная карта равна null.
remove
public V remove(Object key)
k к значению v такое, что (key==null ? k==null :
key.equals(k)), это отображение удаляется. (Такое отображение может быть не более чем одно.) Возвращает значение, с которым эта карта ранее связывала ключ, или null, если в карте не было отображения для ключа. Возвращаемое значение null не обязательно означает, что в карте не было отображения для ключа; также возможно, что карта явно связывала ключ со значением null.
После возврата из вызова карта не будет содержать отображения для указанного ключа.
clear
containsValue
public boolean containsValue(Object value)
true, если эта карта связывает один или несколько ключей с указанным значением.- Определен в:
-
containsValueв интерфейсеMap<K,V> - Переопределяет:
-
containsValueв классеAbstractMap<K,V> - Параметры:
-
value— значение, наличие которого в этой карте необходимо проверить - Возвращает:
-
true, если эта карта связывает один или несколько ключей с указанным значением
keySet
public Set<K> keySet()
Set. Множество поддерживается картой, поэтому изменения карты отражаются в множестве, и наоборот. Если карта изменяется во время итерации по множеству (за исключением изменений с помощью операции remove самого итератора), результаты итерации не определены. Множество поддерживает удаление элементов, которое удаляет соответствующее отображение из карты, с помощью операций Iterator.remove, Set.remove, removeAll, retainAll и clear. Оно не поддерживает операции add или addAll.values
public Collection<V> values()
Collection. Коллекция поддерживается картой, поэтому изменения карты отражаются в коллекции, и наоборот. Если карта изменяется во время итерации по коллекции (за исключением изменений с помощью операции remove самого итератора), результаты итерации не определены. Коллекция поддерживает удаление элементов, которое удаляет соответствующее отображение из карты, с помощью операций Iterator.remove, Collection.remove, removeAll, retainAll и clear. Она не поддерживает операции add или addAll.entrySet
public Set<Map.Entry<K,V>> entrySet()
Set. Множество поддерживается картой, поэтому изменения карты отражаются в множестве, и наоборот. Если карта изменяется во время итерации по множеству (за исключением изменений с помощью операции remove самого итератора или операции setValue для записи карты, возвращенной итератором), результаты итерации не определены. Множество поддерживает удаление элементов, которое удаляет соответствующее отображение из карты, с помощью операций Iterator.remove, Set.remove, removeAll, retainAll и clear. Оно не поддерживает операции add или addAll.newWeakHashMap
public static <K,V> WeakHashMap<K,V> newWeakHashMap(int numMappings)
- Параметры типа:
K— тип ключей, хранящихся в новой картеV— тип сопоставленных значений- Параметры:
-
numMappings— ожидаемое количество отображений - Возвращает:
- созданную карту
- Исключения:
-
IllegalArgumentException— если numMappings отрицательно - С версии:
- 19
© 1993, 2025, 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.