HashMap和TreeMap有什么区别?

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

TreeMap是一个SortedMap的例子,这意味着键的顺序可以被sorting,并且当遍历键时,你可以期望它们是有序的。

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

一般来说, HashMap效率会更高,所以只要你不关心按键的顺序就可以使用它。

HashMap由Hash Table实现, TreeMapRed-Black treeHashMapTreeMap的主要区别实际上是反映了HashBinary Tree的主要区别,即迭代时,TreeMap保证可以通过TreeMap的构造函数中的任意一个元素的compareTo()方法或比较器来确定键顺序。

看看下面的图表 。

在这里输入图像说明

总结一下:

  • HashMap:基于hashCode(),equals()实现的查找数组结构,O(1)用于插入和search的运行时复杂性,unsorted
  • TreeMap:基于compareTo()实现的树结构,用于插入和search的O(log(N))运行时复杂度,sorting

取自: HashMap与TreeMap

大多数时候使用HashMap ,但是当你需要对键进行sorting的时候(当你需要迭代键时)使用TreeMap

我将在Java中讨论HashMapTreeMap的实现:

  • HashMap – 实现基本的地图界面

    1. 由一个桶arrays实现,每个桶是一个LinkedList的条目
    2. 运行时基本操作:put(),平均O(1),最坏情况O(n),在调整表的大小时发生; get(),remove(),平均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都是Java Collection框架的成员。 您可以调查Java的源代码以了解更多关于它们的实现。

你几乎总是使用HashMap ,如果你需要你的密钥按照特定的顺序,你应该只使用TreeMap

HashMap用于快速查找,而TreeMap则用于地图上的sorting迭代。

随着sorting的密钥存储与TreeMap的另一个区别是,开发人员可以给string键(String.CASE_INSENSITIVE_ORDER),因此比较器在执行地图访问上的键比较时忽略键的大小写。 这是不可能的,使用HashMap这样的选项 – 它总是区分大小写在HashMap中的比较。