Spec-Zone.ru › OpenJDK 17

Класс IdentityHashMap<K,V>

java.lang.Object
java.util.AbstractMap<K,V>
java.util.IdentityHashMap<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 при сравнении объектов. Этот класс предназначен только для редких случаев, когда требуются семантика равенства ссылок.

Типичное использование этого класса — преобразование графа объектов, сохраняющее топологию, например, сериализация или глубокое копирование. Для выполнения такого преобразования программа должна поддерживать «таблицу узлов», которая отслеживает все ссылки на объекты, которые уже были обработаны. Таблица узлов не должна считать различными объекты, даже если они случайно равны. Другое типичное использование этого класса — поддержание объектов-прокси. Например, средство отладки может захотеть поддерживать объект-прокси для каждого объекта в отлаживаемой программе.

Этот класс предоставляет все необязательные операции сопоставления и допускает null значения и null ключ. Этот класс не гарантирует порядок сопоставления; в частности, он не гарантирует, что порядок останется постоянным со временем.

Этот класс обеспечивает производительность с постоянным временем для основных операций (get и put), предполагая, что функция хеширования идентификатора системы (System.identityHashCode(Object)) правильно распределяет элементы по корзинам.

Этот класс имеет один параметр настройки (который влияет на производительность, но не на семантику): ожидаемый максимальный размер. Этот параметр представляет собой максимальное количество пар ключ-значение, которые, как ожидается, будет содержать карта. Внутренне этот параметр используется для определения количества корзин, изначально составляющих хеш-таблицу. Точное соотношение между ожидаемым максимальным размером и количеством корзин не определено.

Если размер карты (количество пар ключ-значение) существенно превышает ожидаемый максимальный размер, количество корзин увеличивается. Увеличение количества корзин («перехеширование») может быть довольно дорогим, поэтому стоит создавать карты идентичности с достаточно большим ожидаемым максимальным размером. С другой стороны, итерация по представлениям коллекции требует времени, пропорционального количеству корзин в хеш-таблице, поэтому не стоит устанавливать слишком большой ожидаемый максимальный размер, если вы особенно обеспокоены производительностью итерации или использованием памяти.

Обратите внимание, что данная реализация не синхронизирована. Если несколько потоков обращаются к карте идентичности одновременно, и хотя бы один из потоков структурно изменяет карту, она должна быть синхронизирована внешним образом. (Структурное изменение — любая операция, добавляющая или удаляющая одну или несколько пар; простое изменение значения, связанного с ключом, который уже есть в экземпляре, не является структурным изменением.) Это обычно достигается путем синхронизации на каком-либо объекте, естественным образом инкапсулирующем карту. Если такого объекта не существует, карта должна быть «обернута» с помощью метода Collections.synchronizedMap. Это лучше всего делать во время создания, чтобы предотвратить случайный несинхронизированный доступ к карте:

   Map m = Collections.synchronizedMap(new IdentityHashMap(...));

Итераторы, возвращаемые методом iterator коллекций, возвращаемых всеми методами «представления коллекции» этого класса, являются быстродействующими: если карта структурно изменяется в любое время после создания итератора, каким-либо способом, кроме собственного метода итератора remove, итератор выбросит исключение ConcurrentModificationException. Таким образом, при одновременном изменении итератор быстро и безупречно завершает работу, вместо того, чтобы рисковать произвольным непредсказуемым поведением в неопределенное время в будущем.

Обратите внимание, что гарантии быстродействующего поведения итератора невозможно гарантировать, так как, как правило, невозможно сделать какие-либо строгие гарантии при одновременном несинхронизированном изменении. Итераторы, быстродействующие по умолчанию, выбрасывают ConcurrentModificationException на основе наилучших усилий. Поэтому было бы неправильно писать программу, которая зависела бы от этого исключения для своей корректности: быстродействующие итераторы следует использовать только для обнаружения ошибок.

Этот класс является членом фреймворка Java Collections.

Примечание о реализации:

Это простая хеш-таблица с линейным зондированием, как описано, например, в текстах Сэджвика и Кнута. Массив содержит чередующиеся ключи и значения, причем ключи находятся на четных индексах, а значения — на нечетных. (Эта организация имеет лучшую локальность для больших таблиц, чем использование отдельных массивов.) Для многих реализаций 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)
Удаляет отображение для этого ключа из этой карты, если оно существует.
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, remove, replace, 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)
Проверяет, является ли указанная ссылка на объект ключом в этом хэш-массиве по идентификаторам.
Унаследовано от:
containsKey в интерфейсе Map<K,V>
Переопределяет:
containsKey в классе AbstractMap<K,V>
Параметры:
key - возможный ключ
Возвращает:
true , если указанная ссылка на объект является ключом в этом массиве
См. также:
  • containsValue(Object)

containsValue

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

put

public V put(K key, V value)
Связывает указанное значение с указанным ключом в этом хэш-массиве по идентификаторам. Если в массиве ранее было сопоставление для ключа, старое значение заменяется.
Унаследовано от:
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)
Копирует все сопоставления из указанного массива в этот массив. Эти сопоставления заменят любые сопоставления, которые этот массив имел для любых ключей, которые сейчас есть в указанном массиве.
Унаследовано от:
putAll в интерфейсе Map<K,V>
Переопределяет:
putAll в классе AbstractMap<K,V>
Параметры:
m - сопоставления, которые нужно сохранить в этом массиве
Исключения:
NullPointerException - если указанный массив равен null

remove

public V remove(Object key)
Удаляет сопоставление для этого ключа из этого массива, если оно присутствует.
Унаследовано от:
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()).

Из-за семантики равенства ссылок на объекты в этом массиве, возможно, что требования симметрии и транзитивности контракта 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 , а другой — обычным массивом.

Унаследовано от:
hashCode в интерфейсе Map<K,V>
Переопределяет:
hashCode в классе AbstractMap<K,V>
Возвращает:
значение хэш-кода для этого массива
См. также:
  • Object.equals(Object)
  • equals(Object)

clone

public Object clone()
Возвращает неглубокую копию этого хэш-карты идентичности: ключи и значения сами не клонируются.
Overrides:
clone в классе AbstractMap<K,V>
Returns:
неглубокую копию этой карты
См. также:
  • 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:
представление множества ключей, содержащихся в этой карте, на основе идентичности
См. также:
  • 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(). Чтобы учесть эти семантики equals, метод hashCode возвращает System.identityHashCode(e.getKey()) ^ System.identityHashCode(e.getValue()).

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

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

© 1993, 2021, 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/17/docs/api/java.base/java/util/IdentityHashMap.html

Spec-Zone.ru

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