Класс WeakHashMap<K, V>
- Type Parameters:
-
K- тип ключей, поддерживаемых этой картой -
V- тип сопоставленных значений
- All Implemented Interfaces:
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.
- Since:
- 1.2
- See Also:
Краткое описание вложенных классов
Вложенные классы/интерфейсы, объявленные в классе 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 |
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 представление значений, содержащихся в этой карте. |
Методы, объявленные в классе 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 с заданной начальной ёмкостью и заданным коэффициентом заполнения.- API Note:
- Для создания
WeakHashMapс начальной ёмкостью, достаточной для ожидаемого количества отображений, используйтеnewWeakHashMap. - Параметры:
-
initialCapacity- Начальная ёмкостьWeakHashMap -
loadFactor- Коэффициент заполненияWeakHashMap - Исключения:
-
IllegalArgumentException- если начальная ёмкость отрицательная или коэффициент заполнения не положительный.
WeakHashMap
public WeakHashMap(int initialCapacity)
WeakHashMap с заданной начальной ёмкостью и значением по умолчанию для коэффициента заполнения (0.75).- API Note:
- Для создания
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 - Since:
- 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> - Возвращает:
- вид множества ключей, содержащихся в этой карте
values
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> - Возвращает:
- представление множества отображений, содержащихся в этом отображении
newWeakHashMap
public static <K, V> WeakHashMap<K,V> newWeakHashMap(int numMappings)
- Параметры типа:
-
K- тип ключей, поддерживаемых новым отображением -
V- тип сопоставленных значений - Параметры:
-
numMappings- ожидаемое количество отображений - Возвращает:
- созданное отображение
- Исключения:
-
IllegalArgumentException- если numMappings отрицательный - С:
- 19
© 1993, 2023, 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/21/docs/api/java.base/java/util/WeakHashMap.html