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中的比较。