Класс 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(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() Возвращает представление |
void |
forEach(BiConsumer<? super K,? super V> action) Выполняет заданное действие для каждой записи в этой карте до тех пор, пока все записи не будут обработаны или действие не выбросит исключение. |
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) Удаляет отображение для ключа из этой слабой хэш-карты, если оно присутствует. |
void |
replaceAll(BiFunction<? super K,? super V,? extends V> function) Заменяет значение каждой записи результатом вызова заданной функции для этой записи до тех пор, пока все записи не будут обработаны или функция не выбросит исключение. |
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, getOrDefault, hashCode, merge, putIfAbsent, remove, replace, replace Конструкторы
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, такое что (key==null ? k==null :
key.equals(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 операции.
- Определено в:
-
entrySetв интерфейсеMap<K,V> - Определено в:
-
entrySetв классеAbstractMap<K,V> - Возвращает:
- представление множества отображений, содержащихся в этой карте
forEach
public void forEach(BiConsumer<? super K,? super V> action)
Описание скопировано из интерфейса: Map
Выполняет данное действие для каждой записи в этой карте до тех пор, пока все записи не будут обработаны или действие не выбросит исключение. За исключением случаев, явно указанных реализующим классом, действия выполняются в порядке итерации набора записей (если порядок итерации указан). Исключения, сгенерированные действием, передаются вызывающей стороне.
- Определено в:
-
forEachв интерфейсеMap<K,V> - Параметры:
-
action- действие, которое должно быть выполнено для каждой записи
replaceAll
public void replaceAll(BiFunction<? super K,? super V,? extends V> function)
Описание скопировано из интерфейса: Map
Заменяет значение каждой записи результатом вызова данного функционального интерфейса для этой записи до тех пор, пока все записи не будут обработаны или функция не выбросит исключение. Исключения, выброшенные функцией, передаются вызывающей стороне.
- Определено в:
-
replaceAllв интерфейсеMap<K,V> - Параметры:
-
function- функция, которая должна быть применена к каждой записи
© 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.