HashMap 和 TreeMap 的区别是什么?

我开始学习 Java。什么时候我可以在 TreeMap 上使用 HashMap?

225055 次浏览

大多数情况下使用 HashMap,但在需要对键进行排序时(需要迭代键时)使用 TreeMap

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

另一方面,HashMap 没有这样的保证。因此,当迭代 HashMap的键时,您不能确定它们的顺序。

一般来说,HashMap会更有效率,所以当你不关心键的顺序时就使用它。

你几乎总是使用 HashMap,你应该只使用 TreeMap,如果你需要你的钥匙在一个特定的顺序。

HashMap用于快速查找,而 TreeMap用于映射上的排序迭代。

总而言之:

  • HashMap: 查找-数组结构,基于 hashCode () ,equals ()实现,用于插入和搜索的 O (1)运行时复杂度,未排序
  • TreeMap: 基于 compareTo ()实现的树结构,用于插入和搜索的 O (log (N))运行时复杂度,排序

摘自: HashMap VS TreeMap

与已排序的密钥存储相比,TreeMap 的另一个不同之处在于,开发人员可以使用 String 密钥给出(String.CASE _ INSENSITIVE _ ORDER) ,因此比较器在执行映射访问中的密钥比较时会忽略密钥的大小写。这是不可能给这样的选项与 HashMap-它总是大小写敏感的比较在 HashMap。

我将谈谈 Java 中的 HashMap树木地图实现:

  • HashMap ——实现基本的 map 接口

    1. 由桶数组实现,每个桶是一个条目的 LinkedList
    2. 基本操作的运行时间: put ()、平均 O (1)、最坏情况 O (n) ,在调整表大小时发生; get ()、 delete ()、平均 O (1)
    3. 没有同步,同步它: Map m = Collections.synchronizedMap(new HashMap(...));
    4. 地图的迭代次序是不可预测的。
  • TreeMap ——实现可导航的映射接口

    1. 由红黑树实施
    2. 基本操作的运行时间: put ()、 get ()、 remove ()、最坏情况 O (lgn)
    3. 没有同步,同步它: SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));
    4. 可以使用 higherKey ()、 lowerKey ()来获取给定密钥的继承者和前身。

总之,HashMap 和 TreeMap 之间最大的区别在于 TreeMap 实现了 NavigableMap<K,V>,它提供了有序迭代的特性。此外,HashMap 和 TreeMap 都是 JavaCollection 框架的成员。您可以调查 Java 源代码以了解更多关于它们的实现的信息。

HashMap由哈希表实现,而 TreeMapRed-Black tree实现。HashMapTreeMap之间的主要差异实际上反映了 HashBinary Tree之间的主要差异,也就是说,当迭代时,TreeMap 保证键顺序可以由元素的 compareTo ()方法或 TreeMap 构造函数中的比较器集确定。

看看 下图

enter image description here