一個簡單的例子說明三者關系:
前提:某個衛生間共有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時,表示按照插入順序迭代)。
