Класс IdentityHashMap<K, V>
- Параметры типа:
K- тип ключей, хранящихся в этой картеV- тип сопоставленных значений
- Все реализованные интерфейсы:
Serializable, Cloneable, Map<K,V>
public class IdentityHashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Serializable, Cloneable
Map с помощью хеш-таблицы, используя равенство ссылок вместо равенства объектов при сравнении ключей (и значений). Иными словами, в IdentityHashMap два ключа k1 и k2 считаются равными тогда и только тогда, когда (k1==k2). (В обычных реализациях Map (например, HashMap) два ключа k1 и k2 считаются равными тогда и только тогда, когда (k1==null ? k2==null : k1.equals(k2)).) Этот класс не является реализацией Map общего назначения! Хотя этот класс реализует интерфейс Map, он намеренно нарушает общий контракт Map's, который требует использовать метод equals при сравнении объектов. Этот класс предназначен только для редких случаев, когда требуется семантика равенства ссылок.
Для элементов коллекций-представлений этой карты также используется семантика равенства ссылок. Дополнительные сведения см. в методах keySet, values и entrySet.
Типичный вариант использования этого класса — преобразования графов объектов с сохранением топологии, например сериализация или глубокое копирование. Для выполнения такого преобразования программа должна поддерживать «таблицу узлов», которая отслеживает все ссылки на объекты, уже обработанные ранее. Таблица узлов не должна считать разные объекты равными, даже если они оказываются равными. Ещё один типичный вариант использования этого класса — поддержка объектов-прокси. Например, отладочное средство может поддерживать объект-прокси для каждого объекта отлаживаемой программы.
Этот класс предоставляет все необязательные операции с картами и допускает значения null и ключ null. Этот класс не гарантирует определённый порядок элементов карты; в частности, он не гарантирует, что порядок останется неизменным со временем.
Этот класс обеспечивает постоянное время выполнения основных операций (get и put) при условии, что системная функция хеширования идентичности (System.identityHashCode(Object)) правильно распределяет элементы по сегментам.
У этого класса есть один параметр настройки (который влияет на производительность, но не на семантику): ожидаемый максимальный размер. Этот параметр задаёт максимальное число сопоставлений ключ-значение, которое, как предполагается, будет храниться в карте. Внутри этот параметр используется для определения начального числа сегментов хеш-таблицы. Точная зависимость между ожидаемым максимальным размером и числом сегментов не определена.
Если размер карты (число сопоставлений ключ-значение) значительно превысит ожидаемый максимальный размер, число сегментов увеличится. Увеличение числа сегментов («перехеширование») может быть довольно затратным, поэтому рекомендуется создавать карты идентичности с достаточно большим ожидаемым максимальным размером. С другой стороны, для обхода представлений коллекций требуется время, пропорциональное числу сегментов в хеш-таблице, поэтому не следует задавать слишком большой ожидаемый максимальный размер, если особенно важны производительность обхода или расход памяти.
Обратите внимание, что эта реализация не синхронизирована. Если несколько потоков одновременно обращаются к карте идентичности и хотя бы один из них структурно изменяет карту, необходимо обеспечить внешнюю синхронизацию. (Структурное изменение — это любая операция, добавляющая или удаляющая одно или несколько сопоставлений; простое изменение значения, связанного с ключом, уже содержащимся в экземпляре, не является структурным изменением.) Обычно для этого выполняют синхронизацию по объекту, который естественным образом инкапсулирует карту. Если такого объекта нет, карту следует «обернуть» с помощью метода Collections.synchronizedMap. Лучше всего сделать это при создании карты, чтобы предотвратить случайный доступ к ней без синхронизации:
Map m = Collections.synchronizedMap(new IdentityHashMap(...));
Итераторы, возвращаемые методом iterator коллекций, предоставляемых всеми методами-представлениями коллекций этого класса, являются быстро завершающимися: если после создания итератора карта каким-либо образом структурно изменяется, кроме как через собственный метод remove итератора, итератор выбрасывает исключение ConcurrentModificationException. Таким образом, при одновременном изменении карты итератор быстро и корректно завершается, а не рискует повести себя произвольно и непредсказуемо в неопределённый момент в будущем.
Обратите внимание, что быстрое завершение итератора не может быть гарантировано, поскольку, в общем случае, при одновременном изменении без синхронизации невозможно дать строгие гарантии. Итераторы быстро завершаются и выбрасывают ConcurrentModificationException лишь при наличии такой возможности. Поэтому неправильно писать программу, корректность которой зависит от этого исключения: быстро завершающиеся итераторы следует использовать только для обнаружения ошибок.
Этот класс входит в состав Java Collections Framework.
- Примечание по реализации:
Это простая хеш-таблица с линейным зондированием, описанная, например, в книгах Седжвика и Кнута. Массив содержит чередующиеся ключи и значения: ключи расположены по чётным индексам, а значения — по нечётным. (Для больших таблиц такое расположение обеспечивает лучшую локальность, чем использование отдельных массивов.) Во многих реализациях Java и при многих сочетаниях операций этот класс обеспечивает более высокую производительность, чем
HashMap, в котором вместо линейного зондирования используется цепочечное хеширование.- С момента:
- 1.4
- См. также:
Краткое описание вложенных классов
Вложенные классы и интерфейсы, объявленные в классе AbstractMap
AbstractMap.SimpleEntry<K, V>, AbstractMap.SimpleImmutableEntry<K, V> | Модификатор и тип | Класс | Описание |
|---|---|---|
static class |
AbstractMap.SimpleEntry<K, |
Запись, содержащая ключ и значение. |
static class |
AbstractMap.SimpleImmutableEntry<K, |
Неизменяемая запись, содержащая ключ и значение. |
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
IdentityHashMap() |
Создаёт новую пустую карту идентичности со значением ожидаемого максимального размера по умолчанию (21). |
IdentityHashMap |
Создаёт новую пустую карту с указанным ожидаемым максимальным размером. |
IdentityHashMap |
Создаёт новую карту идентичности, содержащую сопоставления ключ-значение из указанной карты. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
clear() |
Удаляет все сопоставления из этой карты. |
Object |
clone() |
Возвращает поверхностную копию этой карты идентичности: сами ключи и значения не клонируются. |
boolean |
containsKey |
Проверяет, является ли указанная ссылка на объект ключом в этой карте идентичности. |
boolean |
containsValue |
Проверяет, является ли указанная ссылка на объект значением в этой карте идентичности. |
Set |
entrySet() |
Возвращает представление содержащихся в этой карте сопоставлений в виде Set. |
boolean |
equals |
Сравнивает указанный объект с этой картой на равенство. |
V |
get |
Возвращает значение, которому сопоставлен указанный ключ, или null, если в этой карте нет сопоставления для ключа. |
int |
hashCode() |
Возвращает значение хеш-кода этой карты. |
boolean |
isEmpty() |
Возвращает true, если эта карта идентичности не содержит сопоставлений ключ-значение. |
Set |
keySet() |
Возвращает представление ключей этой карты в виде множества с семантикой идентичности. |
V |
put |
Связывает указанное значение с указанным ключом в этой карте идентичности. |
void |
putAll |
Копирует все сопоставления из указанной карты в эту карту. |
V |
remove |
Удаляет из этой карты сопоставление для данного ключа, если оно есть. |
boolean |
remove |
Удаляет запись для указанного ключа, только если в данный момент ему сопоставлено указанное значение (необязательная операция). |
boolean |
replace |
Заменяет запись для указанного ключа, только если в данный момент ему сопоставлено указанное значение (необязательная операция). |
int |
size() |
Возвращает число сопоставлений ключ-значение в этой карте идентичности. |
Collection |
values() |
Возвращает представление содержащихся в этой карте значений в виде Collection. |
Методы, объявленные в классе AbstractMap
toString | Модификатор и тип | Метод | Описание |
|---|---|---|
String |
toString() |
Возвращает строковое представление этой карты. |
Методы, объявленные в классе Object
finalize, getClass, notify, notifyAll, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected void |
finalize() |
Устарело, будет удалено: этот элемент API может быть удалён в будущей версии. Финализация устарела и будет удалена в одном из будущих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно в результате уведомления или прерывания. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно в результате уведомления или прерывания, либо до истечения заданного периода реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно в результате уведомления или прерывания, либо до истечения заданного периода реального времени. |
Методы, объявленные в интерфейсе Map
compute, computeIfAbsent, computeIfPresent, forEach, getOrDefault, merge, putIfAbsent, replace, replaceAll | Модификатор и тип | Метод | Описание |
|---|---|---|
default V |
compute |
Пытается вычислить сопоставление для указанного ключа и его текущего сопоставленного значения либо null, если текущего сопоставления нет (необязательная операция). |
default V |
computeIfAbsent |
Если указанному ключу ещё не сопоставлено значение (или ему сопоставлено null), пытается вычислить его значение с помощью заданной функции сопоставления и добавляет его в эту карту, если результат не равен null (необязательная операция). |
default V |
computeIfPresent |
Если для указанного ключа имеется ненулевое значение, пытается вычислить новое сопоставление, используя ключ и текущее сопоставленное ему значение (необязательная операция). |
default void |
forEach |
Выполняет заданное действие для каждой записи этой карты, пока не будут обработаны все записи или действие не выбросит исключение. |
default V |
getOrDefault |
Возвращает значение, которому сопоставлен указанный ключ, или defaultValue, если в этой карте нет сопоставления для ключа. |
default V |
merge |
Если указанному ключу ещё не сопоставлено значение или ему сопоставлено значение null, связывает его с указанным ненулевым значением (необязательная операция). |
default V |
putIfAbsent |
Если указанному ключу ещё не сопоставлено значение (или ему сопоставлено null), связывает его с указанным значением и возвращает null; в противном случае возвращает текущее значение (необязательная операция). |
default V |
replace |
Заменяет запись для указанного ключа, только если в данный момент ему сопоставлено какое-либо значение (необязательная операция). |
default void |
replaceAll |
Заменяет значение каждой записи результатом вызова заданной функции для этой записи, пока не будут обработаны все записи или функция не выбросит исключение (необязательная операция). |
Краткое описание конструкторов
IdentityHashMap
public IdentityHashMap()
IdentityHashMap
public IdentityHashMap(int expectedMaxSize)
- Параметры:
-
expectedMaxSize— максимальный ожидаемый размер карты - Исключения:
-
IllegalArgumentException— еслиexpectedMaxSizeотрицательно
IdentityHashMap
public IdentityHashMap(Map<? extends K, ? extends V> m)
- Параметры:
-
m— карта, пары «ключ-значение» из которой будут помещены в эту карту - Исключения:
-
NullPointerException— если указанная карта равна null
Подробное описание методов
size
isEmpty
public boolean isEmpty()
true, если эта карта с хешированием по идентичности не содержит пар «ключ-значение».get
public V get(Object key)
null, если в этой карте нет соответствия для данного ключа. Формально, если в этой карте имеется соответствие от ключа k к значению v такое, что (key == k), этот метод возвращает v; в противном случае он возвращает null. (Такое соответствие может быть не более чем одно.)
Возвращаемое значение null не обязательно означает, что в карте нет соответствия для ключа; также возможно, что карта явно сопоставляет ключу значение null. Для различения этих двух случаев можно использовать операцию containsKey.
containsKey
public boolean containsKey(Object key)
true тогда и только тогда, когда в этой карте есть соответствие с ключом k такое, что (key == k).- Указан в:
-
containsKeyв интерфейсеMap<K,V> - Переопределяет:
-
containsKeyв классеAbstractMap<K,V> - Параметры:
-
key— возможный ключ - Возвращает:
-
true, если указанная ссылка на объект является ключом в этой карте - См. также:
containsValue
public boolean containsValue(Object value)
true тогда и только тогда, когда в этой карте есть соответствие со значением v такое, что (value == v).- Указан в:
-
containsValueв интерфейсеMap<K,V> - Переопределяет:
-
containsValueв классеAbstractMap<K,V> - Параметры:
-
value— значение, наличие которого нужно проверить в этой карте - Возвращает:
-
true, если эта карта сопоставляет одну или несколько ключей указанной ссылке на объект - См. также:
put
public V put(K key, V value)
contains имеется соответствие для ключа, старое значение заменяется; в противном случае в карту добавляется новое соответствие.- Указан в:
-
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)
contains имеется соответствие для ключа, его значение заменяется значением из указанной карты; в противном случае в эту карту добавляется новое соответствие.- Указан в:
-
putAllв интерфейсеMap<K,V> - Переопределяет:
-
putAllв классеAbstractMap<K,V> - Параметры:
-
m— соответствия, которые нужно сохранить в этой карте - Исключения:
-
NullPointerException— если указанная карта равна null
remove
public V remove(Object key)
k такой, что (key == k).- Указан в:
-
removeв интерфейсеMap<K,V> - Переопределяет:
-
removeв классеAbstractMap<K,V> - Параметры:
-
key— ключ, соответствие для которого нужно удалить из карты - Возвращает:
- предыдущее значение, связанное с
key, илиnull, если дляkeyне было соответствия. (Возвращаемое значениеnullтакже может означать, что ранее карта связывалаnullсkey.)
clear
equals
public boolean equals(Object o)
true, если переданный объект также является картой и обе карты представляют идентичные соответствия ссылок на объекты. Формально эта карта равна другой карте m тогда и только тогда, когда this.entrySet().equals(m.entrySet()). Спецификацию равенства элементов этой карты см. в методе entrySet. Из-за семантики этой карты, основанной на равенстве ссылок, требования симметричности и транзитивности контракта Object.equals могут нарушаться при сравнении этой карты с обычной картой. Однако соблюдение контракта Object.equals гарантируется для экземпляров IdentityHashMap.
hashCode
public int hashCode()
entrySet. Эта спецификация гарантирует, что m1.equals(m2) подразумевает m1.hashCode()==m2.hashCode() для любых двух экземпляров IdentityHashMap m1 и m2, как того требует общий контракт Object.hashCode().
Из-за семантики, основанной на равенстве ссылок, для экземпляров Map.Entry в множестве, возвращаемом методом entrySet этой карты, требование контракта Object.hashCode, упомянутое в предыдущем абзаце, может нарушаться, если один из сравниваемых объектов является экземпляром IdentityHashMap, а другой — обычной картой.
clone
public Object clone()
- Переопределяет:
-
cloneв классеAbstractMap<K,V> - Возвращает:
- поверхностную копию этой карты
- См. также:
keySet
public Set<K> keySet()
Iterator.remove, Set.remove, removeAll, retainAll и clear. Методы add и addAll не поддерживаются. Хотя объект, возвращаемый этим методом, реализует интерфейс Set, он не соблюдает общий контракт Set's. Как и связанная с ним карта, возвращаемое этим методом множество определяет равенство элементов по идентичности ссылок, а не по равенству объектов. Это влияет на поведение методов contains, remove, containsAll, equals и hashCode.
Метод equals возвращаемого множества возвращает true, только если указанный объект является множеством, содержащим в точности те же ссылки на объекты, что и возвращаемое множество. Требования симметричности и транзитивности контракта Object.equals могут нарушаться при сравнении множества, возвращаемого этим методом, с обычным множеством. Однако соблюдение контракта Object.equals гарантируется для множеств, возвращаемых этим методом.
Метод hashCode возвращаемого множества возвращает сумму хеш-кодов идентичности элементов множества, а не сумму их хеш-кодов. Это обусловлено изменением семантики метода equals и необходимо для соблюдения общего контракта метода Object.hashCode для множеств, возвращаемых этим методом.
values
public Collection<V> values()
Collection. Коллекция связана с картой, поэтому изменения карты отражаются в коллекции, и наоборот. Если карта изменяется во время итерации по коллекции, результаты итерации не определены. Коллекция поддерживает удаление элементов, при котором соответствующее сопоставление удаляется из карты, с помощью методов Iterator.remove, Collection.remove, removeAll, retainAll и clear. Методы add и addAll не поддерживаются. Хотя объект, возвращаемый этим методом, реализует интерфейс Collection, он не соблюдает общий контракт Collection's. Как и связанная с ним карта, возвращаемая этим методом коллекция определяет равенство элементов по идентичности ссылок, а не по равенству объектов. Это влияет на поведение методов contains, remove и containsAll.
entrySet
public Set<Map.Entry<K,V>> entrySet()
Set. Каждый элемент возвращаемого множества — это Map.Entry, основанный на равенстве ссылок. Множество связано с картой, поэтому изменения карты отражаются во множестве, и наоборот. Если карта изменяется во время итерации по множеству, результаты итерации не определены. Множество поддерживает удаление элементов, при котором соответствующее сопоставление удаляется из карты, с помощью методов Iterator.remove, Set.remove, removeAll, retainAll и clear. Методы add и addAll не поддерживаются. Как и связанная с ним карта, объекты Map.Entry в множестве, возвращаемом этим методом, определяют равенство ключей и значений по идентичности ссылок, а не по равенству объектов. Это влияет на поведение методов equals и hashCode этих объектов Map.Entry. Map.Entry
e, основанный на равенстве ссылок, равен объекту o тогда и только тогда, когда o является Map.Entry и e.getKey()==o.getKey() &&
e.getValue()==o.getValue(). Для обеспечения этой семантики equals метод hashCode возвращает System.identityHashCode(e.getKey()) ^
System.identityHashCode(e.getValue()). (Ключи и значения сравниваются по идентичности ссылок, но сами объекты Map.Entry — нет.)
Из-за семантики, основанной на равенстве ссылок, для экземпляров Map.Entry в множестве, возвращаемом этим методом, требования симметричности и транзитивности контракта Object.equals(Object) могут нарушаться, если любую запись множества сравнить с обычной записью карты или если множество, возвращаемое этим методом, сравнить с множеством обычных записей карты (например, возвращаемым вызовом этого метода для обычной карты). Однако соблюдение контракта Object.equals гарантируется для записей карт, основанных на идентичности, и множеств таких записей.
remove
public boolean remove(Object key, Object value)
Формально, если в этой карте имеется соответствие от ключа k к значению v такое, что (key == k) и (value == v), этот метод удаляет соответствие для данного ключа и возвращает true; в противном случае он возвращает false.
replace
public boolean replace(K key, V oldValue, V newValue)
Формально, если в этой карте имеется соответствие от ключа k к значению v такое, что (key == k) и (oldValue == v), этот метод связывает k с newValue и возвращает true; в противном случае он возвращает false.
© 1993, 2025, 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.