HashMap 和 TreeMap 有啥区别? [复制]
Posted
技术标签:
【中文标题】HashMap 和 TreeMap 有啥区别? [复制]【英文标题】:What is the difference between a HashMap and a TreeMap? [duplicate]HashMap 和 TreeMap 有什么区别? [复制] 【发布时间】:2011-01-27 12:17:19 【问题描述】:我开始学习 Java。我什么时候会在 TreeMap 上使用 HashMap?
【问题讨论】:
*** 不仅适用于提问者,也适用于寻求答案的其他人。因此,如果我在这里找到一个我没有的书中也包含的答案,那对我来说非常好...... 【参考方案1】:HashMap
由 Hash Table 实现,TreeMap
由Red-Black tree
实现。 HashMap
和 TreeMap
之间的主要区别实际上反映了 Hash
和 Binary Tree
之间的主要区别,即在迭代时,TreeMap 保证可以由元素的 compareTo() 方法确定的键顺序或在 TreeMap 的构造函数中设置的比较器。
看看following diagram。
【讨论】:
这是否意味着在 TreeMap 中随机获取比 HashMap 更快?【参考方案2】:我将讨论 Java 中的 HashMap 和 TreeMap 实现:
HashMap -- 实现基本地图接口
-
由桶数组实现,每个桶都是一个条目的LinkedList
基本操作的运行时间:put(),平均 O(1),最坏情况 O(n),发生在调整表大小时; get(), remove(), 平均 O(1)
未同步,要同步它:
Map m = Collections.synchronizedMap(new HashMap(...));
地图的迭代顺序是不可预测的。
TreeMap -- 实现可导航的地图接口
-
由红黑树实现
基本操作的运行时间:put()、get()、remove(),最坏情况 O(lgn)
未同步,要同步它:
SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));
提供有序迭代。 highKey(), lowerKey() 可用于获取给定密钥的后继者和前驱者。
综上所述,HashMap和TreeMap最大的区别在于TreeMap实现了NavigableMap<K,V>
,提供了有序迭代的特性。此外,HashMap 和 TreeMap 都是 Java Collection 框架的成员。您可以调查source code of Java 以了解有关其实现的更多信息。
【讨论】:
【参考方案3】:HashMap
用于快速查找,而TreeMap
用于在地图上进行排序迭代。
【讨论】:
【参考方案4】:除了排序键存储之外,TreeMap 的另一个区别是,开发人员可以使用字符串键提供 (String.CASE_INSENSITIVE_ORDER),因此比较器在执行映射访问时的键比较时会忽略键的大小写。 HashMap 无法提供这样的选项 - HashMap 中的比较始终区分大小写。
【讨论】:
没有必要。如果你真的想要这个,你可以简单地为地图制作一个装饰器,对于所有涉及键输入的事情,你将其全部设为大写/小写,并委托给装饰的地图。通过这样做,拥有一个“不区分大小写”的哈希图并不难。无论如何,这个答案可能有点跑题了:你只是在谈论一个非常具体的 treemap 用例,我认为它作为 hashmap/treemap 之间的比较没有什么意义【参考方案5】:总结一下:
HashMap:查找数组结构,基于 hashCode()、equals() 实现,插入和搜索的运行时复杂度为 O(1),未排序 TreeMap:树结构,基于 compareTo() 实现,O(log(N)) 的插入和搜索运行时复杂度,已排序取自:HashMap vs. TreeMap
【讨论】:
HashMap 的复杂度是 O(1+a)。依赖于 hashCode 函数“a”在最坏的情况下可以达到“n”。【参考方案6】:TreeMap
是SortedMap
的一个示例,这意味着可以对键的顺序进行排序,并且在对键进行迭代时,您可以期望它们会按顺序排列。
另一方面,HashMap
不做这样的保证。因此,在遍历 HashMap
的键时,您无法确定它们的顺序。
HashMap
通常会更高效,所以只要你不关心键的顺序就可以使用它。
【讨论】:
HashMap
更省时。 TreeMap
更节省空间。
TreeMap 仅适用于 Comparable 对象,HashMap 仅适用于具有合适 hashCode() 实现的对象。
@erickson:您能否发布参考/链接来支持此声明?
TreeMap
搜索复杂度为 O(log(N)),HashMap
为 O(1),具有良好的 hashCode()。
HashMap 允许空键和空值(只允许一个空键)。如果 TreeMap 使用自然排序或其比较器,不允许空键,则会抛出异常。【参考方案7】:
您几乎总是使用HashMap
,仅当您需要按特定顺序排列密钥时才应使用TreeMap
。
【讨论】:
【参考方案8】:大多数时候使用HashMap
,但当您需要对键进行排序时(当您需要迭代键时)使用TreeMap
。
【讨论】:
在现实世界中,如果对键进行排序很重要?以上是关于HashMap 和 TreeMap 有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
HashMap,TreeMap以及LinkedHashMap的区别