为什么HashMap包含LinkedList而不是AVL树?

时间:2017-02-23 17:28:01

标签: hashmap hashtable

video中的讲师解释说,哈希映射实现通常包含链接列表,以便在发生冲突时链接值。我的问题是:为什么不使用类似AVL树的东西(需要O(log n)进行插入,删除和查找),而不是链接列表(最糟糕的情况下查找O(n))?

据我所知,哈希函数的设计应使碰撞很少见。但是为什么不实施AVL树来优化那些罕见的情况?

1 个答案:

答案 0 :(得分:3)

这取决于实现HashMap的语言。我不认为这是一个严格的规则。

例如在Java中: 您的视频所说的内容适用于Java 7。 在Java 8中,HashMap的实现被更改为在桶超过某一点时使用红黑树。

如果存储桶中的元素数小于8,则使用单链表。一旦它长大于8,它就变成了一棵树。一旦收缩回到6,就会恢复到单链表。

为什么不一直使用树?我想这是内存占用与存储桶内查找复杂性之间的权衡。请记住,大多数哈希函数都会产生很少的冲突,因此维护一个大小为3或4的存储桶的树会因为没有充分的理由而更加昂贵。

作为参考,这是一个HashMap的Java 8 impl(它实际上有一个很好的解释,整个事情是如何工作的,以及为什么他们选择8和6,作为“TREEIFY”和“UNTREEIFY”阈值): http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/HashMap.java?av=f

在Java 7中: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/util/HashMap.java?av=f