一个简单的例子说明三者关系:
前提:某个卫生间共有16个隔间。
HashMap:每个隔间都没锁门,有人想上厕所,管理员指给他一个隔间,里面没人的话正常用,里面有人的话把这个人赶出来然后用。
优点,每个人进来不耽误都能用;缺点,每一个上厕所的人都有被中途赶出来的危险。
Hashtable:在卫生间外面安装一个大门,有人想上厕所,问管理员要一个钥匙进门,把门反锁用,用完后出来,把钥匙交换给管理员。在这个人上厕所期间,其他所有人都必须在外面排号。
优点,每个人都能安心上完厕所;缺点,卫生间外面可能已经出了人命。 =_=
ConcurrentHashMap:在卫生间每个隔间安装门锁,有人想上厕所,管理员指给他一个隔间,进来后这个隔间如果没人在用则直接用,如果有人正在用,则排号。在这期间其他人会按规则分到不同的隔间,重复上述行为。
优点:每个人都能安心上厕所,外面排队的也被均匀分摊。
LinkedHashMap :它跟hashMap一样,区别就是上厕所的人如果排好了队进去,那么也可以排队出来
好了,废话不多说,相信看了上面的例子之后,对这些map有了初步的了解,下面来进入正题:
HashTable:
(1)是一个包含单向链的二维数组,table数组中是Entry<K,V>存储,entry对象;
(2)放入的value不能为空;
(3)线程安全的,所有方法均用synchronized修饰;
HashMap:
(1)相当于HashTable的升级版本;
(2)可以放入空值;
(3)基于hash表实现;
(4)按插入的顺序存储;
(5)线程不安全;
ConcurrentHashMap
通过分析Hashtable就知道,synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,安全的背后是巨大的浪费,那么为了解决这2个问题(资源浪费,不能同时操作),则诞生了“新一代”的集合----ConcurrentHashMap。
专门针对高并发、多线程系统,可以有效的进行本地缓存
当然,它也是线程安全的,我觉得可以理解为ConcurrentHashMap的一个segment相当于是一个HashTable;
ConcurrentHashMap和Hashtable主要区别就是围绕着锁的粒度以及如何锁。如图:
LinkedHashMap
LinkedHashMap继承于HashMap,与HashMap相比,LinkedHashMap增加了两个属性用于保证迭代顺序,分别是 双向链表头结点header 和 标志位accessOrder (值为true时,表示按照访问顺序迭代;值为false时,表示按照插入顺序迭代)。