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 实现,TreeMapRed-Black tree 实现。 HashMapTreeMap 之间的主要区别实际上反映了 HashBinary Tree 之间的主要区别,即在迭代时,TreeMap 保证可以由元素的 compareTo() 方法确定的键顺序或在 TreeMap 的构造函数中设置的比较器。

看看following diagram。

【讨论】:

这是否意味着在 TreeMap 中随机获取比 HashMap 更快?【参考方案2】:

我将讨论 Java 中的 HashMapTreeMap 实现:

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】:

TreeMapSortedMap 的一个示例,这意味着可以对键的顺序进行排序,并且在对键进行迭代时,您可以期望它们会按顺序排列。

另一方面,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 有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

TreeMap和HashMap的区别

java面试题之HashMap和TreeMap的区别

HashMap,TreeMap以及LinkedHashMap的区别

java中hashset和hashmap 有啥特点。

Java中HashMap和LinkedHashMap以及TreeMap的区别

Java中HashMap和TreeMap的区别