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

С тех пор:
1.2
См. также:
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 ключей, содержащихся в этой карте.

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 с заданной начальной ёмкостью и коэффициентом заполнения.

Параметры:
initialCapacity - Начальная ёмкость WeakHashMap
loadFactor - Коэффициент заполнения WeakHashMap
Исключения:
IllegalArgumentException - если начальная ёмкость отрицательная или коэффициент заполнения не положительный.

WeakHashMap

public WeakHashMap(int initialCapacity)

Создаёт новый, пустой WeakHashMap с заданной начальной ёмкостью и стандартным коэффициентом заполнения (0,75).

Параметры:
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>
Возвращает:
представление множества сопоставлений, содержащихся в этом отображении

© 1993, 2020, 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/11/docs/api/java.base/java/util/WeakHashMap.html

Spec-Zone .ru
спецификации, руководства, описания, API