Класс 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 коллекций, возвращаемых всеми методами "представления коллекций" этого класса, являются немедленно-ломающимися: если карта структурно изменяется в любое время после создания итератора, любым способом, кроме метода самого итератора remove, итератор будет выбрасывать исключение ConcurrentModificationException. Таким образом, при одновременном изменении итератор быстро и чётко завершает работу, а не рискует произвольным, непредсказуемым поведением в неопределённое время в будущем.
Обратите внимание, что гарантия немедленного выхода из строя итератора не гарантируется, так как, вообще говоря, невозможно дать какие-либо жёсткие гарантии при одновременном изменении без синхронизации. Итераторы немедленного выхода из строя выбрасывают ConcurrentModificationException на основе наилучших усилий. Поэтому неправильно писать программу, зависящую от этого исключения для её правильности: поведение немедленного выхода из строя итераторов следует использовать только для обнаружения ошибок.
Этот класс является членом Java Collections Framework.
- С тех пор:
- 1.2
- См. также:
Краткое описание вложенных классов
Вложенные классы/интерфейсы, объявленные в классе java.util.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<Map.Entry<K, |
entrySet() |
Возвращает Set представление отображений, содержащихся в этой карте. |
V |
get |
Возвращает значение, которому сопоставлен указанный ключ, или null если эта карта не содержит отображения для ключа. |
boolean |
isEmpty() |
Возвращает true если эта карта не содержит отображений ключ-значение. |
Set<K> |
keySet() |
Возвращает Set представление ключей, содержащихся в этой карте. |
V |
put |
Сопоставляет указанное значение с указанным ключом в этой карте. |
void |
putAll |
Копирует все отображения из указанной карты в эту карту. |
V |
remove |
Удаляет отображение для ключа из этой карты слабых хеш-таблиц, если оно присутствует. |
int |
size() |
Возвращает количество отображений ключ-значение в этой карте. |
Collection<V> |
values() |
Возвращает Collection представление значений, содержащихся в этой карте. |
Методы, объявленные в классе java.util.AbstractMap
clone, equals, hashCode, toString
Методы, объявленные в классе java.lang.Object
finalize, getClass, notify, notifyAll, wait, wait, wait
Методы, объявленные в интерфейсе java.util.Map
compute, computeIfAbsent, computeIfPresent, equals, forEach, getOrDefault, hashCode, merge, putIfAbsent, remove, replace, replace, replaceAll
Подробное описание конструкторов
WeakHashMap
public WeakHashMap(int initialCapacity, float loadFactor)
WeakHashMap с заданной начальной ёмкостью и заданным коэффициентом заполнения.- Параметры:
-
initialCapacity- Начальная ёмкостьWeakHashMap -
loadFactor- Коэффициент заполненияWeakHashMap - Исключения:
-
IllegalArgumentException- если начальная ёмкость отрицательна или коэффициент заполнения не положителен.
WeakHashMap
public WeakHashMap(int initialCapacity)
WeakHashMap с заданной начальной ёмкостью и стандартным коэффициентом заполнения (0.75).- Параметры:
-
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()
- Унаследованно от:
-
sizeв интерфейсеMap<K,V> - Переопределяет:
-
sizeв классеAbstractMap<K,V> - Возвращает:
- количество пар ключ-значение в этой карте
isEmpty
public boolean isEmpty()
true если эта карта не содержит пар ключ-значение. Результат является моментальным снимком и может не отражать необработанные записи, которые будут удалены перед следующим доступом, потому что на них больше нет ссылок.- Унаследованно от:
-
isEmptyв интерфейсеMap<K,V> - Переопределяет:
-
isEmptyв классеAbstractMap<K,V> - Возвращает:
-
trueесли эта карта не содержит пар ключ-значение
get
public V get(Object key)
null , если эта карта не содержит отображения для ключа. Более формально, если эта карта содержит отображение от ключа k к значению v , так что Objects.equals(key, k), то этот метод возвращает v; в противном случае возвращает null. (Может быть не более одного такого отображения.)
Возврат значения null не обязательно указывает, что карта не содержит отображения для ключа; также возможно, что карта явно отображает ключ на null. Операция containsKey может быть использована для различения этих двух случаев.
- Унаследованно от:
-
getв интерфейсеMap<K,V> - Переопределяет:
-
getв классеAbstractMap<K,V> - Параметры:
-
key- ключ, связанное значение которого нужно вернуть - Возвращает:
- значение, которому соответствует указанный ключ, или
null, если эта карта не содержит отображения для ключа - См. также:
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.
Карта не будет содержать отображения для указанного ключа после возврата вызова.
- Унаследованно от:
-
removeв интерфейсеMap<K,V> - Переопределяет:
-
removeв классеAbstractMap<K,V> - Параметры:
-
key- ключ, отображение которого нужно удалить из карты - Возвращает:
- предыдущее значение, связанное с
key, илиnullесли дляkeyне было отображения
clear
public void clear()
- Унаследованно от:
-
clearв интерфейсеMap<K,V> - Переопределяет:
-
clearв классеAbstractMap<K,V>
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. - Унаследованно от:
-
keySetв интерфейсеMap<K,V> - Переопределяет:
-
keySetв классеAbstractMap<K,V> - Возвращает:
- представление множества ключей, содержащихся в этой карте
Значения
public Collection<V> values()
Collection значений, содержащихся в этой карте. Коллекция поддерживается картой, поэтому изменения в карте отражаются в коллекции, и наоборот. Если карта изменяется во время итерации по коллекции (кроме как через собственное remove операцию итератора), результаты итерации не определены. Коллекция поддерживает удаление элементов, что удаляет соответствующее отображение из карты, посредством Iterator.remove, Collection.remove, removeAll, retainAll и clear операций. Она не поддерживает add или addAll операции.- Указано в:
-
valuesв интерфейсеMap<K,V> - Переопределяет:
-
valuesв классеAbstractMap<K,V> - Возвращает:
- представление коллекции значений, содержащихся в этой карте
entrySet
public Set<Map.Entry<K,V>> entrySet()
Set отображений, содержащихся в этой карте. Множество поддерживается картой, поэтому изменения в карте отражаются в множестве, и наоборот. Если карта изменяется во время итерации по множеству (кроме как через собственную remove операцию итератора или через setValue операцию на элементе карты, возвращённом итератором), результаты итерации не определены. Множество поддерживает удаление элементов, что удаляет соответствующее отображение из карты, посредством Iterator.remove, Set.remove, removeAll, retainAll и clear операций. Она не поддерживает add или addAll операции.- Указано в:
-
entrySetв интерфейсеMap<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/WeakHashMap.html