Класс WeakHashMap<K,V>
- java.lang.Object
-
- java.util.AbstractMap<K,V>
-
- java.util.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(int initialCapacity) | Создаёт новую пустую |
WeakHashMap(int initialCapacity,
float loadFactor) | Создаёт новую пустую |
WeakHashMap(Map<? extends K,? extends V> m) | Создаёт новую |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void | clear() | Удаляет все сопоставления из этой карты. |
boolean | containsKey(Object key) | Возвращает |
boolean | containsValue(Object value) | Возвращает |
Set<Map.Entry<K,V>> | entrySet() | Возвращает представление |
V | get(Object key) | Возвращает значение, которому сопоставлен указанный ключ, или |
boolean | isEmpty() | Возвращает |
Set<K> | keySet() | Возвращает представление |
V | put(K key,
V value) | Связывает указанное значение с указанным ключом в этой карте. |
void | putAll(Map<? extends K,? extends V> m) | Копирует все сопоставления из указанной карты в эту карту. |
V | remove(Object key) | Удаляет сопоставление для ключа из этой слабой хеш-карты, если оно присутствует. |
int | size() | Возвращает количество сопоставлений ключ-значение в этой карте. |
Collection<V> | values() | Возвращает представление |
Методы, объявленные в классе 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()
Удаляет все сопоставления из этого отображения. Отображение будет пустым после возврата этого вызова.
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.
© 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