Spec-Zone.ru › OpenJDK 8

Класс 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 отображений, содержащихся в этой карте.

void forEach(BiConsumer<? super K,? super V> action)

Выполняет заданное действие для каждой записи в этой карте до тех пор, пока все записи не будут обработаны или действие не выбросит исключение.

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)

Удаляет отображение для ключа из этой слабой хэш-карты, если оно присутствует.

void replaceAll(BiFunction<? super K,? super V,? extends V> function)

Заменяет значение каждой записи результатом вызова заданной функции для этой записи до тех пор, пока все записи не будут обработаны или функция не выбросит исключение.

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, 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()

Удаляет все отображения из этой карты. Карта будет пустой после возвращения этого вызова.

Задано в:
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>
Определено в:
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.

Spec-Zone.ru

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