Spec-Zone.ru › OpenJDK 24

Класс IdentityHashMap<K,V>

java.lang.Object
java.util.AbstractMap<K,V>
java.util.IdentityHashMap<K,V>
Type Parameters:
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
См. также:
  • System.identityHashCode(Object)
  • Object.hashCode()
  • Collection
  • Map
  • HashMap
  • TreeMap
  • Сериализованная форма

Краткое описание вложенных классов

Вложенные классы/интерфейсы, объявленные в классе java.util.AbstractMap

AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K,V>

Вложенные классы/интерфейсы, объявленные в интерфейсе java.util.Map

Map.Entry<K,V>

Краткое описание конструкторов

Конструктор Описание
IdentityHashMap()
Создаёт новую, пустую карту идентичных хешей с ожидаемым максимальным размером по умолчанию (21).
IdentityHashMap(int expectedMaxSize)
Создаёт новую, пустую карту с указанным ожидаемым максимальным размером.
IdentityHashMap(Map<? extends K, ? extends V> m)
Создаёт новую карту идентичных хешей, содержащую пары ключ-значение из указанной карты.

Краткое описание методов

Модификатор и тип Метод Описание
void clear()
Удаляет все сопоставления из этой карты.
Object clone()
Возвращает поверхностную копию этой карты идентичных хешей: ключи и значения сами не клонируются.
boolean containsKey(Object key)
Проверяет, является ли указанная ссылка на объект ключом в этой карте идентичных хешей.
boolean containsValue(Object value)
Проверяет, является ли указанная ссылка на объект значением в этой карте идентичных хешей.
Set<Map.Entry<K,V>> entrySet()
Возвращает представление Set сопоставлений, содержащихся в этой карте.
boolean equals(Object o)
Сравнивает указанный объект с этой картой на равенство.
V get(Object key)
Возвращает значение, которому сопоставлен указанный ключ, или null, если в этой карте нет сопоставления для ключа.
int hashCode()
Возвращает хэш-код для этой карты.
boolean isEmpty()
Возвращает true, если в этой карте идентичных хешей нет сопоставлений ключ-значение.
Set<K> keySet()
Возвращает представление множества, основанного на идентичности, ключей, содержащихся в этой карте.
V put(K key, V value)
Сопоставляет указанное значение с указанным ключом в этой карте идентичных хешей.
void putAll(Map<? extends K, ? extends V> m)
Копирует все сопоставления из указанной карты в эту карту.
V remove(Object key)
Удаляет сопоставление для этого ключа из этой карты, если оно присутствует.
boolean remove(Object key, Object value)
Удаляет запись для указанного ключа только в том случае, если она в настоящее время сопоставлена с указанным значением (необязательная операция).
boolean replace(K key, V oldValue, V newValue)
Заменяет запись для указанного ключа только в том случае, если она в настоящее время сопоставлена с указанным значением (необязательная операция).
int size()
Возвращает количество пар ключ-значение в этой карте идентичных хешей.
Collection<V> values()
Возвращает представление Collection значений, содержащихся в этой карте.

Методы, объявленные в классе java.util.AbstractMap

toString

Методы, объявленные в классе java.lang.Object

finalize, getClass, notify, notifyAll, wait, wait, wait

Методы, объявленные в интерфейсе java.util.Map

compute, computeIfAbsent, computeIfPresent, forEach, getOrDefault, merge, putIfAbsent, replace, replaceAll

Подробное описание конструкторов

IdentityHashMap

public IdentityHashMap()
Создает новый, пустой хэш-массив с идентичностью с ожидаемым максимальным размером по умолчанию (21).

IdentityHashMap

public IdentityHashMap(int expectedMaxSize)
Создает новую, пустую карту с указанным ожидаемым максимальным размером. Добавление большего количества пар ключ-значение, чем ожидаемое, в карту может привести к увеличению внутренней структуры данных, что может занять некоторое время.
Параметры:
expectedMaxSize - ожидаемый максимальный размер карты
Исключения:
IllegalArgumentException - если expectedMaxSize отрицательное

IdentityHashMap

public IdentityHashMap(Map<? extends K, ? extends V> m)
Создает новый хэш-массив с идентичностью, содержащий пары ключ-значение из указанной карты.
Параметры:
m - карта, чьи пары ключ-значение должны быть помещены в эту карту
Исключения:
NullPointerException - если указанная карта равна null

Подробное описание методов

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 == 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, если и только если эта карта содержит сопоставление с ключом k, таким что (key == k).
Задано в:
containsKey в интерфейсе Map<K,V>
Переопределяет:
containsKey в классе AbstractMap<K,V>
Параметры:
key - возможный ключ
Возвращает:
true, если указанная ссылка на объект является ключом в этой карте
См. также:
  • containsValue(Object)

containsValue

public boolean containsValue(Object value)
Проверяет, является ли указанная ссылка на объект значением в этом хэш-массиве с идентичностью. Возвращает true, если и только если эта карта содержит сопоставление со значением v, таким что (value == v).
Задано в:
containsValue в интерфейсе Map<K,V>
Переопределяет:
containsValue в классе AbstractMap<K,V>
Параметры:
value - значение, чье присутствие в этой карте должно быть проверено
Возвращает:
true, если эта карта отображает один или несколько ключей на указанную ссылку на объект
См. также:
  • containsKey(Object)

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.)
См. также:
  • Object.equals(Object)
  • get(Object)
  • containsKey(Object)

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, такой что (ключ == k).
Задано в:
remove в интерфейсе Map<K,V>
Переопределяет:
remove в классе AbstractMap<K,V>
Параметры:
key - ключ, чье сопоставление должно быть удалено из карты
Возвращает:
предыдущее значение, связанное с key, или null, если для key не было сопоставления. (Возврат null также может указывать, что карта ранее ассоциировала null со значением key.)

clear

public void clear()
Удаляет все сопоставления из этой карты. После возврата этого вызова карта будет пустой.
Задано в:
clear в интерфейсе Map<K,V>
Переопределяет:
clear в классе AbstractMap<K,V>

equals

public boolean equals(Object o)
Сравнивает указанный объект с этой картой на равенство. Возвращает true, если данный объект также является картой, и две карты представляют тождественные отображения ссылок на объекты. Более формально, эта карта равна другой карте m, если и только если this.entrySet().equals(m.entrySet()). Смотрите метод entrySet для спецификации равенства элементов этой карты.

Из-за семантики равенства по ссылкам этой карты возможно, что требования симметрии и транзитивности контракта Object.equals могут быть нарушены, если эта карта сравнивается с обычной картой. Однако контракт Object.equals гарантированно выполняется среди экземпляров IdentityHashMap.

Задано в:
equals в интерфейсе Map<K,V>
Переопределяет:
equals в классе AbstractMap<K,V>
Параметры:
o - объект, который должен быть сравнен на равенство с этой картой
Возвращает:
true, если указанный объект равен этой карте
См. также:
  • Object.equals(Object)

hashCode

public int hashCode()
Возвращает значение хэш-кода для этой карты. Хэш-код карты определяется как сумма хэш-кодов каждой записи этой карты. См. метод entrySet для спецификации хэш-кода записей этой карты.

Эта спецификация гарантирует, что m1.equals(m2) подразумевает, что m1.hashCode()==m2.hashCode() для любых двух IdentityHashMap экземпляров m1 и m2, как требуется общим контрактом Object.hashCode().

Из-за семантики равенства ссылок экземпляров Map.Entry в наборе, возвращаемом методом entrySet этой карты, возможно, что договорённое требование Object.hashCode, упомянутое в предыдущем абзаце, будет нарушено, если один из сравниваемых объектов является экземпляром IdentityHashMap, а другой — обычной картой.

Specified by:
hashCode в интерфейсе Map<K,V>
Overrides:
hashCode в классе AbstractMap<K,V>
Returns:
значение хэш-кода для этой карты
See Also:
  • Object.equals(Object)
  • equals(Object)

clone

public Object clone()
Возвращает неглубокую копию этой карты идентичных хэшей: ключи и значения сами не клонируются.
Overrides:
clone в классе AbstractMap<K,V>
Returns:
неглубокая копия этой карты
See Also:
  • Cloneable

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 среди множеств, возвращаемых этим методом.

Specified by:
keySet в интерфейсе Map<K,V>
Overrides:
keySet в классе AbstractMap<K,V>
Returns:
представление множества ключей, содержащихся в этой карте, на основе идентичности
See Also:
  • Object.equals(Object)
  • System.identityHashCode(Object)

values

public Collection<V> values()
Возвращает представление Collection значений, содержащихся в этой карте. Коллекция подкрепляется картой, поэтому изменения в карте отражаются в коллекции и наоборот. Если карта изменяется во время итерации по коллекции, результаты итерации не определены. Коллекция поддерживает удаление элементов, которые удаляют соответствующее отображение из карты, посредством методов Iterator.remove, Collection.remove, removeAll, retainAll и clear. Она не поддерживает методы add и addAll.

Хотя объект, возвращаемый этим методом, реализует интерфейс Collection, он не подчиняется общему контракту Collection's. Подобно своей карте-источнику, коллекция, возвращаемая этим методом, определяет равенство элементов как равенство ссылок, а не равенство объектов. Это влияет на поведение методов contains, remove и containsAll.

Specified by:
values в интерфейсе Map<K,V>
Overrides:
values в классе AbstractMap<K,V>
Returns:
представление коллекции значений, содержащихся в этой карте

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(). Для согласования с этими семантиками равенства метод hashCode возвращает System.identityHashCode(e.getKey()) ^ System.identityHashCode(e.getValue()). (Хотя ключи и значения сравниваются с помощью равенства ссылок, сами объекты Map.Entry не сравниваются.)

Из-за семантики равенства ссылок экземпляров Map.Entry в множестве, возвращаемом этим методом, возможно, что требования симметрии и транзитивности контракта Object.equals(Object) могут быть нарушены, если любая из записей в множестве сравнивается с обычной записью карты, или если возвращаемое этим методом множество сравнивается со множеством обычных записей карты (таким, которое было бы возвращено вызовом этого метода для обычной карты). Однако контракт Object.equals гарантируется для записей карты на основе идентичности и для множеств таких записей.

Specified by:
entrySet в интерфейсе Map<K,V>
Returns:
представление множества отображений, содержащихся в этой карте, на основе идентичности

remove

public boolean remove(Object key, Object value)
Удаляет запись для указанного ключа только в том случае, если она в настоящее время отображается на указанное значение (необязательная операция).

Более формально, если эта карта содержит отображение от ключа k к значению v, так что (key == k) и (value == v), то этот метод удаляет отображение для этого ключа и возвращает true; в противном случае он возвращает false.

Specified by:
remove в интерфейсе Map<K,V>
Parameters:
key - ключ, с которым ассоциировано указанное значение
value - ожидаемое значение, ассоциированное с указанным ключом
Returns:
true, если значение было удалено

replace

public boolean replace(K key, V oldValue, V newValue)
Заменяет запись для указанного ключа только в том случае, если она в настоящее время отображается на указанное значение (необязательная операция).

Более формально, если эта карта содержит отображение от ключа k к значению v, так что (key == k) и (oldValue == v), то этот метод ассоциирует k со значением newValue и возвращает true; в противном случае он возвращает false.

Specified by:
replace в интерфейсе Map<K,V>
Parameters:
key - ключ, с которым ассоциировано указанное значение
oldValue - ожидаемое значение, ассоциированное с указанным ключом
newValue - значение, которое должно быть ассоциировано с указанным ключом
Returns:
true, если значение было заменено

© 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.
https://download.java.net/java/early_access/jdk24/docs/api/java.base/java/util/IdentityHashMap.html

Spec-Zone.ru

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