实现单独链式Hash Map时,更喜欢插入链表的头部还是尾部?

问题描述

附注: 因为 SO 中的许多人不喜欢讨论 JDK 实现细节的动机/权衡,他们认为 JDK 工程师有权在不告诉任何人的情况下这样做。 (之前关于 JDK 动机的帖子已关闭),这个问题纯粹是关于 HashMap 算法和数据结构以及两个单独的链接实现之间的权衡分析/工程师考虑。

众所周知,我们在实现Hash Map时可以使用seperate chaining method来处理hash collision(每条链都是一个单独的链表)。插入有哈希冲突的新元素时,原则上我们可以选择插入链表的头部或尾部。

两种方法都可以使用相同的最坏时间复杂度。然而,当我学习算法课程时,我的老师告诉我们,我们更喜欢插入到头部,因为一般来说,最近插入的元素有更多的机会被查找。因此,我看到所有带有伪代码或任何编程语言的具体实现的算法或数据结构教科书都选择插入到 head 中。 (例如 Alogirhtms Sedgewick、Clrs(第 258 页)等)

不过前几天看到JDK8的源码HashMapJDK8 选择插入到tail 根据我的知识(JDK 8 source code 中的line 611,641,and putVal() 方法)出乎我的意料。然后我也查了一下JDK7,发现JDK7选择insert into head,跟我们平时学的一样。 (JDK 7 source code 中的 line 402,line 766addEntry() 方法

我的问题:

一般来说,在实现单独的链式HashMap时,插入头部和插入尾部之间的权衡是什么?是否有任何实际的工程师考虑(例如多线程)? (我看过几次 blogs 的讨论,关于如果没有正确同步,插入 head 可能会导致死循环。)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)