Класс WeakHashMap<K, V>
- Параметры типа:
K- тип ключей, хранящихся в этой картеV- тип отображаемых значений
- Все реализуемые интерфейсы:
Map<K,V>
public class WeakHashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>
Map на основе хеш-таблицы с слабыми ключами. Запись в WeakHashMap автоматически удаляется, когда её ключ перестаёт использоваться обычным образом. Точнее, наличие отображения для заданного ключа не препятствует сборщику мусора удалить этот ключ, то есть сделать его доступным для финализации, выполнить финализацию, а затем освободить память. После удаления ключа соответствующая запись фактически удаляется из карты, поэтому этот класс ведёт себя несколько иначе, чем другие реализации Map. Поддерживаются как нулевые значения, так и нулевой ключ. Этот класс обладает характеристиками производительности, сходными с характеристиками класса 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 коллекций, полученных с помощью всех «методов представления коллекций» этого класса, являются fail-fast: если после создания итератора структура карты изменится каким-либо образом, кроме вызова собственного метода remove итератора, итератор выбросит исключение ConcurrentModificationException. Таким образом, при параллельном изменении итератор быстро и корректно завершается с ошибкой, а не подвергается риску произвольного, недетерминированного поведения в неопределённый момент в будущем.
Обратите внимание, что поведение итератора fail-fast не может быть гарантировано, поскольку, вообще говоря, невозможно дать строгие гарантии при наличии несинхронизированных параллельных изменений. Итераторы fail-fast выбрасывают ConcurrentModificationException, пытаясь сделать это наилучшим образом. Поэтому было бы неверно писать программу, правильность которой зависит от этого исключения: поведение итераторов fail-fast следует использовать только для обнаружения ошибок.
Этот класс входит в состав Java Collections Framework.
- Начиная с версии:
- 1.2
- См. также:
Краткое описание вложенных классов
Вложенные классы и интерфейсы, объявленные в классе AbstractMap
AbstractMap.SimpleEntry<K, V>, AbstractMap.SimpleImmutableEntry<K, V>
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
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
Методы, объявленные в интерфейсе Map
compute, computeIfAbsent, computeIfPresent, equals, forEach, getOrDefault, hashCode, merge, putIfAbsent, remove, replace, replace, 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.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/WeakHashMap.html