为什么Java中的TreeMap不使用Array作为Bucket?

问题描述 投票:0回答:1

我很好奇并开始了解TreeMap在Java内部是如何实现的。而且,我发现它使用红黑树来保持基于键的条目的排序顺序。

我的问题是为什么它不使用数组作为存储桶以及红黑树。这不是会使搜索平均时间复杂度变为 O(1) 吗?

我的意思是 LinkedHashMap 使用双向链表维护插入顺序,并且条目根据键和容量散列到数组桶中。为什么Java开发者不以类似的方式制作TreeMap?它不会使插入变得更加耗时、复杂,对吧,因为我们只需要为每个条目维护指向左、右、父级等的指针,并根据红黑树的插入规则更新这些指针。我的意思是整个过程是相同的,除了映射到数组存储桶中。如果它也映射到数组存储桶,则搜索将变为 O(1)。我在这里错过了什么吗?

java java-8 hashmap treemap linkedhashmap
1个回答
0
投票

TreeMap 使用比较器,并且仅使用比较器来查找元素。

鼓励该比较器与 equals (和 hashCode)兼容,但不是必需的。 TreeMap 不能依赖于哈希码,否则会违反它自己的规则。

此外,当许多键散列到同一个桶中时,散列可能会退化为 O(n),而二叉搜索树则保证为 O(log n)。事实上,这就是为什么 HashMap 在内部会回退到二叉搜索树来处理存储桶冲突。

如果用户想使用哈希值,他们可以。如果他们选择 TreeMap,那么他们想要它的行为是有原因的。这不是疏忽,也不是错误。

© www.soinside.com 2019 - 2024. All rights reserved.