Класс 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 с точки зрения наилучшего результата. Поэтому неправильно писать программу, которая полагается на это исключение для своей корректности: быстропроверяемые итераторы следует использовать только для обнаружения ошибок.

Примечание реализации: это простая хеш-таблица с линейным зондированием, как описано, например, в текстах Сedgewick и Knuth. Массив чередуется, содержащий ключи и значения. (Это обеспечивает лучшую локальность для больших таблиц, чем использование отдельных массивов.) Для многих реализаций JRE и наборов операций этот класс обеспечит лучшую производительность, чем HashMap (который использует цепирование, а не линейное зондирование).

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

С тех пор:
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()

Возвращает поверхностную копию этого отображения идентичности: ключи и значения сами по себе не клонируются.

Переопределяет:
clone в классе AbstractMap<K,​V>
Возвращает:
поверхностную копию этого отображения
См. также:
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 между наборами, возвращаемыми этим методом.

Указано в:
keySet в интерфейсе Map<K,​V>
Переопределяет:
keySet в классе AbstractMap<K,​V>
Возвращает:
представление набора ключей на основе идентификатора, содержащихся в этой карте
См. также:
Object.equals(Object), System.identityHashCode(Object)

значения

public Collection<V> values()

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

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

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

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 в наборе, возвращаемом этим методом, возможно, что требования симметрии и транзитивности контракта Object.equals(Object) могут быть нарушены, если любой из элементов набора сравнивается с обычной записью карты, или если возвращаемый этим методом набор сравнивается с набором обычных записей карты (например, тот, что возвращается этим методом для обычной карты). Однако контракт Object.equals гарантируется для элементов карты на основе идентичности и для наборов таких элементов.

Указано в:
entrySet в интерфейсе Map<K,​V>
Возвращает:
представление набора идентичных отображений, содержащихся в этой карте

© 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.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/IdentityHashMap.html

Spec-Zone .ru
спецификации, руководства, описания, API