Spec-Zone.ru › OpenJDK 27

Класс WeakHashMap<K,V>

java.lang.Object
java.util.AbstractMap<K,V>
java.util.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
См. также:
  • HashMap
  • WeakReference

Краткое описание вложенных классов

Вложенные классы и интерфейсы, объявленные в классе AbstractMap

AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K,V>
Модификатор и тип Класс Описание
static class  AbstractMap.SimpleEntry<K,V>
Запись, содержащая ключ и значение.
static class  AbstractMap.SimpleImmutableEntry<K,V>
Неизменяемая запись, содержащая ключ и значение.

Краткое описание конструкторов

Конструктор Описание
WeakHashMap()
Создаёт новую пустую WeakHashMap с начальной ёмкостью по умолчанию (16) и коэффициентом загрузки по умолчанию (0.75).
WeakHashMap(int initialCapacity)
Создаёт новую пустую WeakHashMap с заданной начальной ёмкостью и коэффициентом загрузки по умолчанию (0.75).
WeakHashMap(int initialCapacity, float loadFactor)
Создаёт новую пустую WeakHashMap с заданными начальной ёмкостью и коэффициентом загрузки.
WeakHashMap(Map<? extends K, ? extends V> m)
Создаёт новую WeakHashMap с теми же отображениями, что и в указанной карте.

Краткое описание методов

Модификатор и тип Метод Описание
void clear()
Удаляет все отображения из этой карты.
boolean containsKey(Object key)
Возвращает true, если эта карта содержит отображение для указанного ключа.
boolean containsValue(Object value)
Возвращает true, если эта карта сопоставляет одному или нескольким ключам указанное значение.
Set<Map.Entry<K,V>> entrySet()
Возвращает представление содержащихся в этой карте отображений в виде Set.
V get(Object key)
Возвращает значение, сопоставленное указанному ключу, или null, если в этой карте нет отображения для данного ключа.
boolean isEmpty()
Возвращает true, если эта карта не содержит отображений «ключ-значение».
Set<K> keySet()
Возвращает представление содержащихся в этой карте ключей в виде Set.
static <K,V> WeakHashMap<K,V> newWeakHashMap(int numMappings)
Создаёт новую пустую WeakHashMap, подходящую для ожидаемого количества отображений.
V put(K key, V value)
Сопоставляет указанное значение указанному ключу в этой карте.
void putAll(Map<? extends K, ? extends V> m)
Копирует все отображения из указанной карты в эту карту.
V remove(Object key)
Удаляет отображение для ключа из этой слабой хеш-карты, если оно существует.
int size()
Возвращает количество отображений «ключ-значение» в этой карте.
Collection<V> values()
Возвращает представление содержащихся в этой карте значений в виде Collection.

Методы, объявленные в классе AbstractMap

clone, equals, hashCode, toString
Модификатор и тип Метод Описание
protected Object clone()
Возвращает поверхностную копию этого экземпляра AbstractMap: сами ключи и значения не клонируются.
boolean equals(Object o)
Сравнивает указанный объект с этой картой на равенство.
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(long timeoutMillis)
Заставляет текущий поток ожидать пробуждения, обычно в результате уведомления или прерывания, либо до истечения заданного промежутка реального времени.
final void wait(long timeoutMillis, int nanos)
Заставляет текущий поток ожидать пробуждения, обычно в результате уведомления или прерывания, либо до истечения заданного промежутка реального времени.

Методы, объявленные в интерфейсе Map

compute, computeIfAbsent, computeIfPresent, forEach, getOrDefault, merge, putIfAbsent, remove, replace, replace, replaceAll
Модификатор и тип Метод Описание
default V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
Пытается вычислить отображение для указанного ключа и его текущего сопоставленного значения либо null, если текущее отображение отсутствует (необязательная операция).
default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
Если указанному ключу ещё не сопоставлено значение (или ему сопоставлено null), пытается вычислить его значение с помощью заданной функции отображения и добавляет его в эту карту, если результат не равен null (необязательная операция).
default V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
Если для указанного ключа имеется ненулевое значение, пытается вычислить новое отображение на основе ключа и текущего сопоставленного ему значения (необязательная операция).
default void forEach(BiConsumer<? super K, ? super V> action)
Выполняет заданное действие для каждой записи этой карты, пока не будут обработаны все записи или действие не выбросит исключение.
default V getOrDefault(Object key, V defaultValue)
Возвращает значение, сопоставленное указанному ключу, или defaultValue, если в этой карте нет отображения для данного ключа.
default V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)
Если указанному ключу ещё не сопоставлено значение или ему сопоставлено null, сопоставляет ему заданное ненулевое значение (необязательная операция).
default V putIfAbsent(K key, V value)
Если указанному ключу ещё не сопоставлено значение (или ему сопоставлено null), сопоставляет ему заданное значение и возвращает null; в противном случае возвращает текущее значение (необязательная операция).
default boolean remove(Object key, Object value)
Удаляет запись для указанного ключа, только если в данный момент ему сопоставлено указанное значение (необязательная операция).
default V replace(K key, V value)
Заменяет запись для указанного ключа, только если в данный момент ему сопоставлено какое-либо значение (необязательная операция).
default boolean replace(K key, V oldValue, V newValue)
Заменяет запись для указанного ключа, только если в данный момент ему сопоставлено указанное значение (необязательная операция).
default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function)
Заменяет значение каждой записи результатом вызова заданной функции для этой записи, пока не будут обработаны все записи или функция не выбросит исключение (необязательная операция).

Подробное описание конструкторов

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()
Возвращает количество отображений ключ-значение в этой карте. Это моментальный снимок, который может не учитывать необработанные записи, удаляемые до следующей попытки доступа, поскольку на них больше нет ссылок.
Определен в:
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, если в этой карте нет отображения для ключа
См. также:
  • put(Object, Object)

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)
Создает новую пустую WeakHashMap, подходящую для ожидаемого количества отображений. Возвращаемая карта использует коэффициент загрузки по умолчанию 0.75, а ее начальная емкость, как правило, достаточна для добавления ожидаемого количества отображений без изменения размера карты.
Параметры типа:
K — тип ключей, хранящихся в новой карте
V — тип сопоставленных значений
Параметры:
numMappings — ожидаемое количество отображений
Возвращает:
созданную карту
Исключения:
IllegalArgumentException — если numMappings отрицательно
С версии:
19

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, обзоры концепций, определения терминов, обходные решения и работающие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторское право © 1993, 2026, Oracle и/или ее аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API