Spec-Zone.ru › OpenJDK 25

Класс 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.

Поддерживаются как нулевые значения, так и нулевой ключ. Этот класс обладает характеристиками производительности, сходными с характеристиками класса 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
См. также:
  • HashMap
  • WeakReference

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

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

AbstractMap.SimpleEntry<K,V>, 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

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

finalize, getClass, notify, notifyAll, wait, wait, wait

Методы, объявленные в интерфейсе 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()
Возвращает количество отображений ключ-значение в этой карте. Результат является снимком состояния и может не учитывать необработанные записи, которые будут удалены до следующей попытки доступа, поскольку на них больше нет ссылок.
Определено в:
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, 2025, 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.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/WeakHashMap.html

Spec-Zone.ru

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