java中HashMap,LinkedHashMap,TreeMap,HashTable,ConcurrentHashMap的区别和内部实现机制

首先简单介绍下,这几种map的应用场景:

HashMap 存储键值对,没有什么特殊的功能;

LinkedHashMap在存储的同时,能够保存用户插入数据的顺序,如果需要输出用户插入map的顺序可以用它;

TreeMap 插入数据后,对键值进行排序,内部是通过红黑树实现的;

HashTable 与HashMap的功能相同,区别有两点:

1.HashTable是线程安全的,即某一时刻只允许一个线程访问;

2.同时HashTable键值不允许为空,而HashMap可以

如果HashTable想要允许多线程访问,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。

下面分别介绍下它们内部的实现原理:

Hashmap

0.75是经过大量的实验得出的比例。这里解释下为什么n必须为2的整数倍。因为为了提高运算效率,Hashmap源码中取模运算是用的2进制(如a%b=a&(b-1)),这种运算要求b必须为2的整数倍才能得到正确的取余结果。这里不要较真,说为什么非得这么取余,弄得n必须为2的倍数,至于这先生蛋还是先生鸡的问题,就不在这里讨论了。

LinkedHashMap

LinkedHashMap继承了HashMap,只不是是扩展了Entry类,增加了指向上一个节点的指针、指向下一个节点的指针。然后定义了一个扩展entry类的头节点按照存入顺序或访问顺序保存这个双向链表。

TreeMap

TreeMap内部是用红黑数存储的,所以有排序的功能,至于红黑数的具体实现可以参考这篇博文,介绍的很详细:

http://blog.csdn.net/chenssy/article/details/26668941

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一步一台阶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值