Класс 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 с точки зрения наилучшего результата. Поэтому неправильно писать программу, которая полагается на это исключение для своей корректности: быстропроверяемые итераторы следует использовать только для обнаружения ошибок.
Примечание реализации: это простая хеш-таблица с линейным зондированием, как описано, например, в текстах С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() | Возвращает представление |
boolean | equals(Object o) | Сравнивает указанный объект с этой картой на равенство. |
V | get(Object key) | Возвращает значение, которому сопоставлен указанный ключ, или |
int | hashCode() | Возвращает значение хэш-кода для этой карты. |
boolean | isEmpty() | Возвращает |
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() | Возвращает представление |
Методы, объявленные в классе 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()
Удаляет все соответствия из этого отображения. После возвращения из этого вызова отображение будет пустым.
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 гарантируется для элементов карты на основе идентичности и для наборов таких элементов.
© 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