Класс 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 по возможности. Поэтому неправильно писать программу, зависящую от этого исключения для правильности: быстропроваливающиеся итераторы должны использоваться только для обнаружения ошибок.
Примечание по реализации: это простая хеш-таблица с линейным зондированием, как описано, например, в текстах Сэджвика и Кнута. Массив чередуется, содержащий ключи и значения. (Это обеспечивает лучшую локальность для больших таблиц, чем использование отдельных массивов.) Для многих реализаций 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) Сравнивает указанный объект с этой картой на равенство. |
void |
forEach(BiConsumer<? super K,? super V> action) Выполняет заданное действие для каждой записи в этой карте, пока все записи не будут обработаны или действие не выбросит исключение. |
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) Удаляет сопоставление для этого ключа из этой карты, если оно присутствует. |
void |
replaceAll(BiFunction<? super K,? super V,? extends V> function) Заменяет значение каждой записи результатом вызова заданной функции для этой записи, пока все записи не будут обработаны или функция не выбросит исключение. |
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, getOrDefault, merge, putIfAbsent, remove, replace, replace Краткое описание конструкторов
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)
values
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> - Определено в:
-
entrySetв классеAbstractMap<K,V> - Возвращает:
- представление множества отображений, содержащихся в этой карте
forEach
public void forEach(BiConsumer<? super K,? super V> action)
Описание скопировано из интерфейса: Map
Выполняет заданное действие для каждой записи в этой карте до тех пор, пока все записи не будут обработаны или действие не выбросит исключение. За исключением случаев, указанных в реализующем классе, действия выполняются в порядке итерации набора записей (если порядок итерации указан.) Исключения, выброшенные действием, передаются вызывающему объекту.
- Определено в:
-
forEachв интерфейсеMap<K,V> - Параметры:
-
action- действие, которое будет выполнено для каждой записи
replaceAll
public void replaceAll(BiFunction<? super K,? super V,? extends V> function)
Описание скопировано из интерфейса: Map
Заменяет значение каждой записи результатом вызова заданной функции для этой записи до тех пор, пока все записи не будут обработаны или функция не выбросит исключение. Исключения, выброшенные функцией, передаются вызывающему объекту.
- Определено в:
-
replaceAllв интерфейсеMap<K,V> - Параметры:
-
function- функция, которая будет применена к каждой записи
© 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.