为什么IdentityHashMap使用线性探测来解决冲突
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么IdentityHashMap使用线性探测来解决冲突相关的知识,希望对你有一定的参考价值。
正如我们在Java Collections框架中所知道的,[Map
中的每个类都使用Chaining来解决冲突,而IdentityHashMap
则使用线性探测来解决。
如果您看到的是Java文档,则会提到:
对于许多JRE实现和操作组合,此类将产生比HashMap(使用链结而非线性探测)。
我的问题是:
为什么实施者仅对
IdentityHashMap
使用liner probing,而不是对所有Map
实现,如果linear probing中的性能更好。为什么要在线性探测
中获得性能提升,然后在链式 中得到提升。
坦克。
我们在java集合框架中知道,Map中的每个类都使用Chaining来解决冲突,但是IdentityHashMap对其使用线性探测。如果您看到Java文档,它已经提到:...
这可能会引起一些启发(摘自Oracle网站:]
实施说明:这是一个简单的线性探针哈希表,例如Sedgewick和Knuth的文本中所述。该数组交替按住键和值。 (与使用单独的数组相比,此方法在大型表中具有更好的局部性。)对于许多JRE实现和操作混合,此类将比HashMap产生更好的性能
构建身份哈希映射时,没有机会找到两个彼此相等但不是同一对象的实例。它还使用System.identityHashCode
,这在System.identityHashCode
的设计人员之前就已经知道有发生碰撞的机会,并且它很小。在这些“实验室”条件下,就性能而言,线性探测似乎是一个更好的选择。
[我怀疑类库的设计人员之所以在“常规”哈希图中使用链接而不是线性探测,是因为即使在哈希函数不是最优的情况下,他们也希望保持良好的性能。
IdentityHashMap
:
实施说明:这是一个简单的线性探针哈希表,例如Sedgewick和Knuth的文本中所述。该数组交替按住键和值。 ((对于大型表,其局部性比使用单独的数组要好。)
对于许多JRE实现和操作混合,此类将比HashMap(使用链接而不是线性探测)产生更好的性能。
以上是关于为什么IdentityHashMap使用线性探测来解决冲突的主要内容,如果未能解决你的问题,请参考以下文章