Java HashMap和TreeMap之间有什么区别?

Java HashMap和TreeMap之间有什么区别?,java,Java,我开始学习Java。什么时候我会在树状图上使用HashMap?大多数时候使用HashMap,但当需要对键进行排序时(当需要迭代键时),使用TreeMap。是一个示例,这意味着可以对键的顺序进行排序,并且在迭代键时,你可以期待他们会井然有序 另一方面,中国没有做出这样的保证。因此,在迭代HashMap的键时,您无法确定它们的顺序 HashMap通常效率更高,所以只要你不关心键的顺序,就可以使用它。你几乎总是使用HashMap,如果你需要你的键按特定的顺序排列,你应该只使用TreeMap。HashM

我开始学习Java。什么时候我会在树状图上使用HashMap?

大多数时候使用
HashMap
,但当需要对键进行排序时(当需要迭代键时),使用
TreeMap

是一个示例,这意味着可以对键的顺序进行排序,并且在迭代键时,你可以期待他们会井然有序

另一方面,中国没有做出这样的保证。因此,在迭代
HashMap
的键时,您无法确定它们的顺序


HashMap
通常效率更高,所以只要你不关心键的顺序,就可以使用它。

你几乎总是使用
HashMap
,如果你需要你的键按特定的顺序排列,你应该只使用
TreeMap

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

总结如下:

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

取自:

以及排序键存储。另一个不同之处在于TreeMap,开发人员可以使用字符串键给出(String.CASE\u INSENSITIVE\u ORDER),因此比较器在地图访问上执行键比较时忽略键的大小写。在HashMap中不可能给出这样的选项-HashMap中总是区分大小写的比较。

我将讨论Java中的HashMapTreeMap实现:

  • HashMap——实现基本映射接口

  • 通过一组bucket实现,每个bucket都是一个LinkedList条目
  • 基本操作的运行时间:put(),平均O(1),最坏情况O(n),在调整表的大小时发生;获取(),删除(),平均O(1)
  • 未同步,要同步它:
    Map m=Collections.synchronizedMap(新HashMap(…)
  • 映射的迭代顺序是不可预测的
  • TreeMap——实现可导航地图接口

  • 由红黑树实现
  • 基本操作的运行时间:put()、get()、remove()、最坏情况O(lgn)
  • 未同步,要同步它:
    SortedMap m=Collections.synchronizedSortedMap(新树映射(…)
  • 提供有序的迭代。higherKey(),lowerKey()可用于获取给定键的后续键和前置键

总之,HashMap和TreeMap最大的区别在于TreeMap实现了
NavigableMap
,它提供了有序迭代的特性。此外,HashMap和TreeMap都是Java集合框架的成员。您可以调查以了解更多关于其实现的信息

HashMap
是通过哈希表实现的,而
TreeMap
是通过
红黑树实现的。
HashMap
TreeMap
之间的主要区别实际上反映了
Hash
Binary Tree
之间的主要区别,也就是说,在迭代时,TreeMap可以保证由元素的compareTo()方法或TreeMap构造函数中设置的比较器确定的键顺序

看一看


HashMap
更省时。
TreeMap
更节省空间。TreeMap只适用于可比较的对象,HashMap只适用于具有合适hashCode()实现的对象。@erickson:您能发布一个引用/链接来备份此语句吗?
TreeMap
搜索复杂度是O(log(N)),
HashMap
是O(1)和一个好的hashCode().HashMap允许空键和空值(只允许一个空键)。如果TreeMap使用自然排序或其比较器,不允许空键,则会引发异常。Stackoverflow不仅适用于提问者,也适用于其他寻求答案的人。因此,如果我在这里找到一个答案,这个答案也包含在一些我没有的书中,这对我来说是非常好的。如果你真的想这样做,你可以简单地为一个地图做一个装饰器,对于所有涉及按键输入的事情,你都可以使用大写/小写,并委托给装饰过的地图。通过这样做,拥有一个“不区分大小写”的hashmap并不难。不管怎么说,这个答案可能有点离题了:您只讨论了treemap的一个非常具体的用例,对于这个用例,我不认为它作为hashmap/TreeMapt之间的比较有什么意义hashmap的复杂性是o(1+a)。依赖于hashCode函数“a”在最坏的情况下可以达到“n”。这意味着TreeMap中的随机抓取比HashMap快吗?