Spec-Zone .ru
спецификации, руководства, описания, API
|
public class IdentityHashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Serializable, Cloneable
Этот класс не является реализацией Map общего назначения! В то время как этот класс реализует интерфейс Map, он преднамеренно нарушает Map's общий контракт, который передает под мандат использование метода equals, сравнивая объекты. Этот класс разрабатывается для использования только в редких случаях в чем, семантика ссылочного равенства требуется.
Типичное использование этого класса является сохраняющими топологию преобразованиями графа объектов, такими как сериализация или глубокое копирование. Чтобы выполнить такое преобразование, программа должна поддержать "таблицу узла", которая отслеживает все ссылки на объект, которые были уже обработаны. Таблица узла не должна приравнять отличные объекты, даже если они, оказывается, равны. Другое типичное использование этого класса должно поддержать объекты прокси. Например, средство отладки могло бы хотеть поддержать объект прокси для каждого объекта в отлаживаемой программе.
Этот класс обеспечивает все дополнительные операции карты, и разрешает значения null и ключ null. Этот класс не делает гарантий относительно порядка карты; в частности это не гарантирует, что порядок останется постоянным в течение долгого времени.
Этот класс обеспечивает постоянно-разовую производительность для основных операций (get и put), принимая системную хеш-функцию идентификационных данных (System.identityHashCode(Object)
) рассеивает элементы должным образом среди блоков.
У этого класса есть один настраивающий параметр (который влияет на производительность, но не семантику): ожидаемый максимальный размер. Этот параметр является максимальным количеством отображений значения ключа, которые карта, как ожидают, будет содержать. Внутренне, этот параметр используется, чтобы определить число блоков, первоначально включающих хэш-таблицу. Точное отношение между ожидаемым максимальным размером и числом блоков является неуказанным.
Если размер карты (число отображений значения ключа) достаточно превышает ожидаемый максимальный размер, число блоков увеличивается, Увеличивая число блоков ("перефразирование"), может быть довольно дорогим, таким образом, это платит, чтобы создать карты хеша идентификационных данных с достаточно большим ожидаемым максимальным размером. С другой стороны итерация по представлениям набора требует времени, пропорционального числу блоков в хэш-таблице, таким образом, это платит, чтобы не установить ожидаемый максимальный размер слишком высоко, если Вы особенно обеспокоены итеративной производительностью или использованием памяти.
Отметьте, что эта реализация не синхронизируется. Если многократные потоки получают доступ к карте хеша идентификационных данных одновременно, и по крайней мере один из потоков изменяет карту структурно, это должно синхронизироваться внешне. (Структурная модификация является любой работой, которая добавляет или удаляет одно или более отображений; просто изменение значения, связанного с ключом, который уже содержит экземпляр, не является структурной модификацией.) Это обычно выполняется, синхронизируясь на некотором объекте, который естественно инкапсулирует карту. Если никакой такой объект не существует, карта должна быть "обернута", используя Collections.synchronizedMap
метод. Это лучше всего делается во время создания, чтобы предотвратить случайный несинхронизируемый доступ к карте:
Map m = Collections.synchronizedMap(new IdentityHashMap(...));
iterators, возвращенные методом iterator наборов, возвращенных всеми "методами представления набора этого класса", являются сбоем быстро: если карта структурно изменяется когда-либо после того, как iterator создается, всегда кроме через собственный метод remove iterator, iterator бросит a ConcurrentModificationException
. Таким образом, перед лицом параллельной модификации, iterator перестал работать быстро и чисто, вместо того, чтобы рискнуть произвольным, недетерминированным поведением в неопределенное время в будущем.
Отметьте, что поведение сбоя быстро iterator не может быть гарантировано, как, вообще говоря, невозможно сделать любые трудные гарантии в присутствии несинхронизируемой параллельной модификации. Перестаньте работать быстро iterators бросают ConcurrentModificationException на основе максимальных усилий. Поэтому, было бы неправильно записать программу, которая зависела от этого исключения для его правильности: сбой быстро iterators должен использоваться только, чтобы обнаружить ошибки.
Примечание реализации: Это - простая линейно-тестовая хэш-таблица, как описано например в текстах Sedgewick и Knuth. Массив чередует кнопки блокировочные и значения. (У этого есть лучшее местоположение для больших таблиц, чем делает использование отдельные массивы.) Для многих реализаций JRE и смесей работы, этот класс приведет к лучшей производительности чем HashMap
(который использует объединение в цепочку, а не линейное зондирование).
Этот класс является элементом Платформы Наборов Java.
System.identityHashCode(Object)
, Object.hashCode()
, Collection
, Map
, HashMap
, TreeMap
, Сериализированная ФормаAbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K,V>
Конструктор и Описание |
---|
IdentityHashMap()
Создает новую, пустую карту хеша идентификационных данных со значением по умолчанию ожидаемый максимальный размер (21).
|
IdentityHashMap(int expectedMaxSize)
Создает новую, пустую карту с указанным ожидаемым максимальным размером.
|
IdentityHashMap(Map<? extends K,? extends V> m)
Создает новую карту хеша идентификационных данных, содержащую отображения ключевого значения в указанной карте.
|
Модификатор и Тип | Метод и Описание |
---|---|
void |
clear()
Удаляет все отображения из этой карты.
|
Объект |
clone()
Возвращает мелкую копию этой карты хеша идентификационных данных: ключи и сами значения не клонируются.
|
boolean |
containsKey(Object key)
Тесты, является ли указанная ссылка на объект ключом в этой карте хеша идентификационных данных.
|
boolean |
containsValue(Object value)
Тесты, является ли указанная ссылка на объект значением в этой карте хеша идентификационных данных.
|
Set<Map.Entry<K,V>> |
entrySet()
Возвраты a
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()
Возвраты a
Collection представление значений содержится в этой карте. |
toString
public IdentityHashMap()
public IdentityHashMap(int expectedMaxSize)
expectedMaxSize
- ожидаемый максимальный размер картыIllegalArgumentException
- если expectedMaxSize отрицателенpublic IdentityHashMap(Map<? extends K,? extends V> m)
m
- карта, отображения которой должны быть помещены в эту картуNullPointerException
- если указанная карта является нулемpublic int size()
public boolean isEmpty()
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)
public boolean containsKey(Object key)
containsKey
в интерфейсе Map<K,V>
containsKey
в классе AbstractMap<K,V>
key
- возможный ключtrue
если указанная ссылка на объект является ключом в этой картеcontainsValue(Object)
public boolean containsValue(Object value)
containsValue
в интерфейсе Map<K,V>
containsValue
в классе AbstractMap<K,V>
value
- оцените, чье присутствие в этой карте должно быть протестированоcontainsKey(Object)
public V put(K key, V value)
put
в интерфейсе Map<K,V>
put
в классе AbstractMap<K,V>
key
- ключ, с которым должно быть связано указанное значениеvalue
- значение, которое будет связано с указанным ключомObject.equals(Object)
, get(Object)
, containsKey(Object)
public void putAll(Map<? extends K,? extends V> m)
putAll
в интерфейсе Map<K,V>
putAll
в классе AbstractMap<K,V>
m
- отображения, которые будут сохранены в этой картеNullPointerException
- если указанная карта является нулемpublic V remove(Object key)
remove
в интерфейсе Map<K,V>
remove
в классе AbstractMap<K,V>
key
- манипулируйте, чье отображение должно быть удалено из картыpublic void clear()
public boolean equals(Object o)
Вследствие ссылочного равенства базируемая семантика этой карты возможно, что требования симметрии и транзитивности контракта Object.equals могут быть нарушены, если эта карта по сравнению с картой нормалей. Однако, контракт Object.equals, как гарантируют, будет содержать среди экземпляров IdentityHashMap.
equals
в интерфейсе Map<K,V>
equals
в классе AbstractMap<K,V>
o
- объект, который будет сравнен для равенства с этой картойObject.equals(Object)
public int hashCode()
Object.hashCode()
. Вследствие ссылочного равенства базируемая семантика экземпляров Map.Entry в наборе, возвращенном методом entrySet этой карты, возможно, что договорное требование Object.hashCode, упомянутого в предыдущем абзаце, будет нарушено, если один из двух сравниваемых объектов будет экземпляром IdentityHashMap, и другой карта нормалей.
hashCode
в интерфейсе Map<K,V>
hashCode
в классе AbstractMap<K,V>
Object.equals(Object)
, equals(Object)
public Object clone()
clone
в классе AbstractMap<K,V>
Cloneable
public Set<K> keySet()
В то время как объект, возвращенный этим методом, реализует интерфейс 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.
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, как гарантируют, будет содержать среди основанных на идентификационных данных записей карты, и среди наборов таких записей.
Для дальнейшей ссылки API и документации разработчика, см.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.