java基礎篇(2)——集合框架總結篇

集合框架總結

我們常用的集合框架有Map集合(HashMap、HashTable、TreeMap)、List集合(ArrayList、LinkedList)、Set集合(HashSet)

常用的併發集合框架有ConcurrentHashMap、CopyOnWriteArrayList、CopyOnWriteLinkedList等

一一解析:

Map集合存放key-value結構數據,常用的有HashMap、HashTable、TreeMap

HashMap底層是一個Entry[]數組,數組中存放的是一個Node鏈表;當put(key,value),一對key,value到hashMap中時,先求key的hash值,找到對應的buket,若該key已存在則替換原來的值,若發生hash碰撞,則將對應的value存到鏈表中。

HashMap的負載因子是0.75,既數組中的值佔全部數組容量的75%時就會擴容,擴容爲原來的兩倍。

另:在JDK1.8中,當鏈表的長度大於8時轉而存儲爲紅黑樹。紅黑樹的時間複雜度是O(lgn)

HashTable既是在HashMap的部分方法上加上synchronized關鍵是,使其轉變爲線程安全的HashMap。

TreeMap的底層數據結構是紅黑樹,所以存入其中的集合遍歷時是有序的。

List集合常用的有ArrayList、LinkedList

ArrayList集合底層是一個數組,所以查詢效率高,增刪效率低,每次擴展爲原來的3/2倍+1

LinkedList底層是一個雙向鏈表結構,所以其增刪效率高查詢效率低。

Set集合常用的有HashSet、TreeSet

HashSet集合底層其實使用HashMap實現的,它利用HashMap的key不能重複的特性,用key存儲數據,並將所有的value都是設爲null

常用的併發集合框架解析

ConcurrentHashMap是java1.5新增的併發集合框架,它採用了分段鎖的設計,初始化時,生成16個segment,每個segment內都有一個類似hashmap的hashEntry。只有在同一個分段內的數據才存在競態關係,不同的分段鎖之間沒有鎖競爭。所以理論上,ConcurrentHashMap最多可以允許16個線程併發put數據到不同的segment中。

    當put一個key-value到ConcurrentHashMap中時,先對key進行hash計算找到其對應的segment,再將key-value存入對應的hashentry中。

    相比於對整個Map加鎖的設計,分段鎖大大的提高了高併發環境下的處理能力。但同時,由於不是對整個Map加鎖,導致一些需要掃描整個Map的方法(如size(), containsValue())需要使用特殊的實現,另外一些方法(如clear())甚至放棄了對一致性的要求(ConcurrentHashMap是弱一致性的。)

    當統計ConcurrentHashMap包含多少個值時,先後對ConcurrentHashMap統計兩次,若兩次統計的結果一致,既兩次統計的過程中mod值沒有改變則返回統計結果;如果兩次統計的值不一致,則鎖定整個ConcurrentHashMap,for循環統計其size。

CopyOnWriteArrayList和CopyOnWriteLinkedList

    它們分別是基於Copy-On-Write容器的ArrayList和LinkedList。CopyOnWrite容器即寫時複製的容器。通俗的理解是當我們往一個容器添加元素的時候,不直接往當前容器添加,而是先將當前容器進行Copy,複製出一個新的容器,然後新的容器裏添加元素,添加完元素之後,再將原容器的引用指向新的容器。這樣做的好處是我們可以對CopyOnWrite容器進行併發的讀,而不需要加鎖,因爲當前容器不會添加任何元素。所以CopyOnWrite容器也是一種讀寫分離的思想,讀和寫不同的容器。

    它適用於讀多寫少的情況。具體詳情參考:Java中的Copy-On-Write容器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章