public class IdentityHashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Serializable, Cloneable
这类不通用Map实施!虽然这类实现Map接口,它故意违反Map's总承包,其授权的equals方法时使用比较对象。这个类是专为使用只有在罕见的情况下,其中参考平等的语义是必需的。
这个类是一个典型的使用象图转换,如序列化或深拷贝。要执行这样的转换,程序必须维护一个“节点表”,该“节点表”跟踪已处理的所有对象引用。节点表不能等同于不同的对象,即使它们恰好是相等的。这节课的另一个典型的用途是保持代理对象。例如,一个调试设备可能希望为正在被调试的程序中的每个对象维护一个代理对象。
这个类提供了所有可选的Map操作,并允许null值和null关键。这个类对映射的顺序没有保证;特别是,它不保证订单将保持恒定的随着时间的推移。
这类的基本操作提供了稳定的性能(get和put),假设系统身份的哈希函数(System.identityHashCode(Object)
)分散元素之间的正确的桶。
这个类有一个可调参数(影响性能而不是语义):预期的最大尺寸。此参数是映射将要保持的键值映射的最大值数。在内部,这个参数用于确定最初包含哈希表的桶的数量。预期的最大大小和桶的数量之间的精确关系是未指定的。
如果这张Map的大小(键值对映射的数量)足够超过预期的最大大小,桶的数量增加,增加桶的数量(“老调重弹”)可能是相当昂贵的,以创建一个足够大的预期的最大尺寸标识哈希映射。另一方面,迭代的集合视图需要时间与哈希表中的桶的数量成正比,所以它不支付预期的最大尺寸太高,如果你是特别关注与迭代性能或内存使用。
如果多个线程访问同一请注意,此实现不同步。哈希映射的同时,并至少有一个线程修改Map的结构,它必须同步外部。(结构上的修改是任何操作,添加或删除一个或多个映射;仅仅改变一个关键实例已经包含了不是一个结构上的修改。相关的价值)这通常是由一些对象同步自然封装图完成。如果该对象不存在,Map应该是“包裹”使用Collections.synchronizedMap
方法。最好的做法是在创建时,防止意外的非同步访问的Map:
MapM =集合。synchronizedmap(新identityhashmap(…));
迭代器返回的集合的iterator方法所有这一类的“集合视图的方法”快速失败返回:如果Map的结构修改,迭代器创建后的任何时间,以任何方式除了通过迭代器的remove方法,迭代器将抛出一个ConcurrentModificationException
。因此,在并发修改的面前,迭代器失败迅速和干净,而不是冒着任意的,非确定性的行为在未来的一个不确定的时间。
注意迭代器不能快速失败行为得到保证的话,一般来说,不可能在不同步的并发修改的存在作出难以保证。快速失败迭代器扔ConcurrentModificationException尽最大努力的基础上。因此,要写一个程序,依靠这一例外的正确性错误:快速失败迭代器只能用来检测错误。
实施注:这是一个简单的线阵探头哈希表,例如在描述塞奇威克和Knuth的文本。数组中的键和值的交替着。(这有更好的地方的大表比使用单独的数组。)许多JRE实现和操作的混合,这类产量将比HashMap
更好的性能(使用链接而不是线性探测)。
这个班的一员 Java Collections Framework。
System.identityHashCode(Object)
,
Object.hashCode()
,
Collection
,
Map
,
HashMap
,
TreeMap
,
Serialized Form
AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K,V>
Constructor and Description |
---|
IdentityHashMap()
构造一个默认的预期最大大小(21)的新的空标识哈希映射。
|
IdentityHashMap(int expectedMaxSize)
构造一个新的,空的映射与指定的预期最大大小。
|
IdentityHashMap(Map<? extends K,? extends V> m)
在指定的映射中构造包含键值映射的新的身份哈希映射。
|
Modifier and Type | Method and Description |
---|---|
void |
clear()
从这个映射中移除所有的映射。
|
Object |
clone()
返回这个身份哈希映射的浅副本:键和值本身没有被克隆。
|
boolean |
containsKey(Object key)
测试指定的对象引用是否是这个身份哈希映射中的一个密钥。
|
boolean |
containsValue(Object value)
测试指定的对象引用是否在这个身份哈希映射中的值。
|
Set<Map.Entry<K,V>> |
entrySet()
返回一个
Set 视图的映射包含在这个Map。
|
boolean |
equals(Object o)
将指定的对象与此映射的相等性进行比较。
|
void |
forEach(BiConsumer<? super K,? super V> action)
在该映射中的每个条目执行给定的操作,直到所有的条目被处理或操作抛出异常。
|
V |
get(Object key)
返回指定的键映射的值,或
null 如果这个Map不包含的键映射。
|
int |
hashCode()
返回此映射的哈希代码值。
|
boolean |
isEmpty()
返回
true如果身份的哈希映射不包含键值的映射。
|
Set<K> |
keySet()
返回包含在该Map中的键的基于身份的集合视图。
|
V |
put(K key, V value)
将指定的值与此身份哈希映射中的指定键关联。
|
void |
putAll(Map<? extends K,? extends V> m)
从指定的映射到该Map的所有映射。
|
V |
remove(Object key)
如果存在的话,从这个映射中移除这个键的映射。
|
void |
replaceAll(BiFunction<? super K,? super V,? extends V> function)
将每个条目的值替换为在该项上调用给定函数的结果,直到所有的条目都被处理或函数抛出异常。
|
int |
size()
返回这个身份哈希映射中的键值映射的数目。
|
Collection<V> |
values()
返回一个
Collection 的价值观包含在这个Map。
|
toString
finalize, getClass, notify, notifyAll, wait, wait, wait
compute, computeIfAbsent, computeIfPresent, getOrDefault, merge, putIfAbsent, remove, replace, replace
public IdentityHashMap()
public IdentityHashMap(int expectedMaxSize)
expectedMaxSize
Map的预期的最大尺寸
IllegalArgumentException
-如果
expectedMaxSize是负的
public IdentityHashMap(Map<? extends K,? extends V> m)
m
的映射被放置到这个Map的Map
NullPointerException
-如果指定的Map是空的
public int size()
public boolean isEmpty()
public V get(Object key)
null
如果这个Map不包含的键映射。
更正式地说,如果这个图中包含了从关键k
到价值v
这样(key == k)
映射,那么这个方法返回v
;否则返回null
。(最多可以有一个这样的映射。)
一个null
返回值不必要地表明Map不包含的键映射;也有可能是Map明确地映射到null
关键。的containsKey
操作可用于区分这两例。
get
接口
Map<K,V>
get
方法重写,继承类
AbstractMap<K,V>
key
-关键的相关值被返回
null
如果这个Map不包含的键映射
put(Object, Object)
public boolean containsKey(Object key)
containsKey
接口
Map<K,V>
containsKey
方法重写,继承类
AbstractMap<K,V>
key
-可能的关键
true
如果指定对象引用在这张Map上的一个关键
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
映射被存储在这个Map
NullPointerException
-如果指定的Map是空的
public void clear()
public boolean equals(Object o)
由于参考基于平等的语义Map是可能的Object.equals合同的对称性和传递性要求可能受到侵犯,如果这张Map是比较正常的Map。然而,这Object.equals合同保证在IdentityHashMap实例。
等于另一个。equals
接口
Map<K,V>
equals
方法重写,继承类
AbstractMap<K,V>
o
对象进行比较,这张Map的平等
Object.equals(Object)
public int hashCode()
Object.hashCode()
一般合同要求。
由于参考基于平等的语义集合中的Map.Entry实例这个Map的entrySet方法返回,这是可能的,Object.hashCode前项合同要求将违反如果要比较的两个对象是一个IdentityHashMap实例,另一个是正常的Map。
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总承包。像它的支持Map,通过这种方法返回的集合定义元素的平等,而不是对象的平等的参考平等。这会影响其contains,remove,containsAll,equals行为,和hashCode方法。
返回的集合的true只返回指定对象是否是一套包含完全相同的对象引用作为返回设置equals方法。该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
视图的值包含在这个Map。集合是由Map支持的,所以对Map的变化反映在集合中,反之亦然。如果映射被修改,而集合的迭代正在进行中,迭代的结果是不确定的。收集支持元素的去除,从Map中移除相应的映射,通过
Iterator.remove,
Collection.remove,
removeAll,
retainAll和
clear方法。它不支持
add或
addAll方法。
在使用该方法返回的对象实现Collection接口,它不服从Collection's总承包。像它的支持Map,通过这种方法返回的集合定义元素的平等,而不是对象的平等的参考平等。这会影响其contains行为,remove和containsAll方法。
public Set<Map.Entry<K,V>> entrySet()
Set
视图的映射包含在这个Map。在返回的集合的每个元素的基础
Map.Entry参考平等。集由Map的支持,所以Map的变化反映在集,反之亦然。如果映射被修改,而集合的一个迭代正在进行中,迭代的结果是不确定的。设置支持元素的去除,从Map中移除相应的映射,通过
Iterator.remove,
Set.remove,
removeAll,
retainAll和
clear方法。它不支持
add或
addAll方法。
喜欢背Map,在设置Map.Entry此方法返回的对象定义的键和值作为参考,而不是对象的平等平等平等。这影响到这些Map.Entry对象equals和hashCode方法的行为。如果o是Map.Entry和e.getKey()==o.getKey() && e.getValue()==o.getValue()参考基于平等Map.Entry e等于物体o。为了适应这些等于语义学的hashCode方法返回System.identityHashCode(e.getKey()) ^ System.identityHashCode(e.getValue())。
由于参考基于平等的语义集合中的Map.Entry该方法返回的实例,它是可能的Object.equals(Object)
合同的对称性和传递性的要求可能会违反任何条目中的设置是比较正常的Map进入,或者由该方法返回的是一组正常的Map作品(例如将调用此方法在正常的Map返回)。然而,这Object.equals合同保证保持基础的Map作品认同,在这样的作品集。
public void forEach(BiConsumer<? super K,? super V> action)
Map
public void replaceAll(BiFunction<? super K,? super V,? extends V> function)
Map
replaceAll
接口
Map<K,V>
function
-功能适用于每一个条目
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.