Map的实现,在比较key和value时用引用相等代替对象相等.换言之,在一个IdentityHashMap中,两个key k1和k2 当且仅当k1==k2时 是相等的。然而 在正常的Map实现中,例如HashMap中,
当且仅当(k1==null ? k2==null : k1.equals(k2))
时两个key被认为是相等的。
这个类不是通用的Map实现 故意违反了Map的规范
这个类的典型用法 是 拓扑保持对象图转换
如serialization or deep-copying. 执行这样的操作转换,程序必须保持一个保持跟踪的“节点表”,所有已被处理的对象引用、节点表不能等同于不同的对象,即使它们恰好相等。
另一个典型的用法是 维护代理对象 例如 调试工具可能希望维护代理对象给正在调试的程序中的每个对象。
此类提供所有可选的映射操作,并允许Null值和null键 。不保证Map的顺序 特别的 不能保证随着时间的推移,秩序将保持不变
此类为基础提供恒定的时间性能操作(get和put)
假设系统标识hash 函数 ({@ Link ShultIyIdHythHash码(object)})
在桶中适当分散元素
这个类有一个调整参数 影响性能 但不是语义
期望最大大小 此参数为最大值。
映射所需的键值映射的数目 此参数用于确定初始桶的数量
精确关系在期望的最大尺寸和未指定的bucket的数量
如果映射的大小(键值映射的数目)足够超过预期的最大尺寸,桶的数量增加。
*增加桶的数量(“rehashing”)可能相当昂贵,所以创建具有足够大预期最大尺寸的标识哈希映射是值得的
需要对集合视图进行迭代。时间与哈希表中的桶数成正比,*支付不要设置预期的最大尺寸过高,如果你是特别关注迭代性能或内存使用情况
同步
此实现不同步如果多个线程同时访问标识哈希映射,则至少有一个线程在结构上修改了映射,它必须外部同步。结构修改是指任何操作。添加或删除一个或多个映射;仅更改值
与实例已经包含的键关联不是结构修改。这通常是通过对一些自然封装地图的对象进行同步。
如果不存在这样的对象,则应该使用“包装”来映射该映射。
{@link Collections#synchronizedMap Collections.synchronizedMap}方法
最好在创建时完成,以防止意外发生。对地图的非同步访问
Map m = Collections.synchronizedMap(new IdentityHashMap(...));
迭代器
由该类的“集合视图”返回的集合
fail-fast
如果映射在结构上被修改 在创建迭代器之后的任何时间,以任何方式除外
通过迭代器自己的remove方法,迭代器将引发ConcurrentModificationException.
因此,在面对并行修改的时候,迭代器应当快速失效、清洁,而不是冒险随意,在未来的一个不确定的时间非确定性行为
注意,迭代器的故障快速行为不能得到保证。事实上,一般来说,不可能作出任何硬的保证。
存在不同步的并发修改。Fail-fast iterators*在尽力的基础上抛出ConcurrentModificationException
因此,编写一个依赖于此的程序是错误的。失败快速迭代器只应使用检测