天天看点

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

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

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

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

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

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

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

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

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

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

Hashmap

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

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