为什么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使用线性探测来解决冲突的主要内容,如果未能解决你的问题,请参考以下文章

基于拉链式和线性探测式散列表实现Map

线性探测中不同探针序列的数量

处理哈希冲突的闭散列方法-线性探测

容器--IdentityHashMap

java 此哈希表实现使用单独的链接和线性探测。

线性探测-闭散列