简单总结关于一些map集合的区别

时间:2022-10-06 19:39:48
 
一个简单的例子说明三者关系:
前提:某个卫生间共有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主要区别就是围绕着锁的粒度以及如何锁。如图:
 
简单总结关于一些map集合的区别
 
 
LinkedHashMap 
LinkedHashMap继承于HashMap,与HashMap相比,LinkedHashMap增加了两个属性用于保证迭代顺序,分别是 双向链表头结点header 和 标志位accessOrder (值为true时,表示按照访问顺序迭代;值为false时,表示按照插入顺序迭代)。
简单总结关于一些map集合的区别