簡單總結關於一些map集合的區別


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM