java hashmap treemap_关于java:HashMap和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中设置的比较器确定的键顺序。卡车司机。

看看下面的图表。

5bfeba89361ed46f9010821d4a9610f2.png

这意味着在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之间的比较是非常有意义的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值