HashMap和TreeMap有什么区别?
我开始学习Java。 我什么时候在TreeMap上使用HashMap?
TreeMap是一个SortedMap的例子,这意味着键的顺序可以被sorting,并且当遍历键时,你可以期望它们是有序的。
另一方面, HashMap没有这样的保证。 因此,当迭代HashMap的键时,你不能确定它们将以什么顺序。
一般来说, HashMap效率会更高,所以只要你不关心按键的顺序就可以使用它。
HashMap由Hash Table实现, TreeMap由Red-Black tree 。 HashMap和TreeMap的主要区别实际上是反映了Hash和Binary Tree的主要区别,即迭代时,TreeMap保证可以通过TreeMap的构造函数中的任意一个元素的compareTo()方法或比较器来确定键顺序。
看看下面的图表 。

总结一下:
- HashMap:基于hashCode(),equals()实现的查找数组结构,O(1)用于插入和search的运行时复杂性,unsorted
- TreeMap:基于compareTo()实现的树结构,用于插入和search的O(log(N))运行时复杂度,sorting
取自: HashMap与TreeMap
大多数时候使用HashMap ,但是当你需要对键进行sorting的时候(当你需要迭代键时)使用TreeMap 。
我将在Java中讨论HashMap和TreeMap的实现:
-
HashMap – 实现基本的地图界面
- 由一个桶arrays实现,每个桶是一个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(...)); - 提供有序的迭代。 可以使用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中的比较。