Spec-Zone.ru › OpenJDK 21

Класс WeakHashMap<K,V>

java.lang.Object
java.util.AbstractMap<K,V>
java.util.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:
  • HashMap
  • WeakReference

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

Вложенные классы/интерфейсы, объявленные в классе java.util.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 представление значений, содержащихся в этой карте.

Методы, объявленные в классе 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 если эта карта не содержит отображения для ключа
См. также:
  • 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

© 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

Spec-Zone.ru

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