Класс WeakHashMap<K, V>
- Type Parameters:
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.
- 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:
- Чтобы создать
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 ключей, содержащихся в этом map. Множество поддерживается map, поэтому изменения в map отражаются в множестве и наоборот. Если map изменяется во время итерации по множеству (кроме операций самого итератора remove), результаты итерации не определены. Множество поддерживает удаление элементов, что удаляет соответствующее отображение из map, через операции Iterator.remove, Set.remove, removeAll, retainAll и clear. Оно не поддерживает операции add или addAll.values
public Collection<V> values()
Collection значений, содержащихся в этом map. Коллекция поддерживается map, поэтому изменения в map отражаются в коллекции и наоборот. Если map изменяется во время итерации по коллекции (кроме операций самого итератора remove), результаты итерации не определены. Коллекция поддерживает удаление элементов, что удаляет соответствующее отображение из map, через операции Iterator.remove, Collection.remove, removeAll, retainAll и clear. Она не поддерживает операции add или addAll.entrySet
public Set<Map.Entry<K,V>> entrySet()
Set отображений, содержащихся в этом map. Множество поддерживается map, поэтому изменения в map отражаются в множестве и наоборот. Если map изменяется во время итерации по множеству (кроме операций самого итератора remove или операции setValue на элементе map, возвращенном итератором), результаты итерации не определены. Множество поддерживает удаление элементов, что удаляет соответствующее отображение из map, через операции Iterator.remove, Set.remove, removeAll, retainAll и clear. Оно не поддерживает операции add или addAll.newWeakHashMap
public static <K,V> WeakHashMap<K,V> newWeakHashMap(int numMappings)
- Параметры типа:
K- тип ключей, поддерживаемых новым mapV- тип сопоставленных значений- Параметры:
-
numMappings- ожидаемое количество отображений - Возвращает:
- недавно созданный map
- Исключения:
-
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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/util/WeakHashMap.html