What is the difference between a HashMap and a TreeMap?
我开始学习Java。我什么时候在树映射上使用哈希映射?
- StackOverflow不仅仅是针对提问者,也适用于寻求答案的其他人。因此,如果我在这里找到一个答案,也包含在一些我没有的书中,那对我来说是非常好的…
TreeMap是SortedMap的一个示例,这意味着可以对键的顺序进行排序,并且在对键进行迭代时,可以预期它们将按顺序排列。
另一方面,没有这样的保证。因此,在迭代HashMap的键时,您无法确定它们的顺序。
一般来说,HashMap会更有效,因此无论何时您不关心键的顺序,都可以使用它。
- HashMap更省时。aTreeMap更节省空间。
- treemap只适用于可比较的对象,hashmap只适用于具有适当hashcode()实现的对象。
- @埃里克森:你能发布一个参考/链接来支持这个声明吗?
- 搜索复杂度为o(log(n)),HashMap为o(1)with a good hashcode()。
- hashmap允许空键和空值(只允许一个空键)。如果treemap使用自然排序或其comparator,不允许空键,则会引发异常。
HashMap由哈希表实现,而TreeMap由Red-Black tree实现。HashMap和TreeMap之间的主要区别实际上反映了aHash和aBinary Tree之间的主要区别,也就是说,在迭代时,treemap保证可以是由元素的compareTo()方法或在treemap的cons中设置的比较器确定的键顺序。卡车司机。
看看下面的图表。
- 这意味着在Treemap中随机获取比哈希映射更快吗?
总结如下:
- hashmap:查找数组结构,基于hashcode(),equals()实现,o(1)插入和搜索的运行时复杂性,未排序
- treemap:树结构,基于compareto()实现,o(log(n))插入和搜索的运行时复杂性,排序
取自:hashmap与treemap
- hashmap的复杂性是o(1+a)。在最坏的情况下,依赖于hashcode函数"a"可以达到"n"。
大多数情况下使用HashMap,但需要对密钥进行排序时(需要迭代密钥时)使用TreeMap。
我将在Java中讨论HashMap和TeReMAP实现:
-
hashmap——实现基本映射接口
- 由一个存储桶数组实现,每个存储桶都是一个条目的LinkedList
- 基本操作的运行时间:Put()、Average O(1)、Worst Case O(N),在调整表大小时发生;get()、remove()、Average O(1)
- 不同步,要同步它:Map m = Collections.synchronizedMap(new HashMap(...));
- 地图的迭代顺序是不可预测的。
-
treemap——实现可导航地图接口
- 由红黑树实现
- 基本操作运行时间:put()、get()、remove()、worst case o(lgn)
- 不同步,要同步它:SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));
- 提供有序迭代。higherkey()、lowerkey()可用于获取给定键的后续项和前置项。
总之,hashmap和treemap最大的区别在于treemap实现了NavigableMap,这提供了有序迭代的特性。此外,HashMap和TeeMeAP都是Java集合框架的成员。您可以研究Java的源代码,以了解更多关于它们的实现。
HashMap用于快速查找,而TreeMap用于映射上的排序迭代。
您几乎总是使用HashMap,如果您需要您的密钥按特定顺序排列,则只应使用TreeMap。
除了排序后的密钥存储,Treemap的另一个不同之处在于,开发人员可以用字符串键给出(string.case不区分大小写的顺序),因此比较器在对映射访问上的密钥进行比较时忽略键的大小写。对于hashmap,这是不可能给出这样的选项的-在hashmap中,它总是区分大小写的比较。
- 不需要。如果您真的想要这样做,您可以简单地为一个映射制作一个修饰器,对于所有涉及键输入的事情,您可以将其全部设置为大写/小写,并委托给已修饰的映射。这样做,就不难得到"不区分大小写"的哈希图。不管怎样,这个答案可能有点离题:你所说的只是Treemap的一个非常具体的用例,我不认为它作为hashmap/Treemap之间的比较是非常有意义的。