Java入門學習-深入理解集合

gongjinsi發表於2017-05-07

集合框架主要包括兩種型別的容器,
一種是集合(Collection),儲存一個元素集合,
另一種是圖(Map),儲存鍵/值對對映。

Collection介面又有3種子型別,List、Set和Queue,再下面是一些抽象類,最後是具體實現類,常用的有ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap等等。

1、List:
允許重複的有序集合,List介面主要是增加了面向位置的操作

//如果記憶體不夠,開闢新記憶體:
 int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);//>>右移一位,相當於除以2
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);

所以當記憶體不夠時,會開闢原有記憶體的1.5倍。
ArrayList適合尾部改動的情況
LinkList適合中間改動的情況

2、set:
不包含重複的元素
Set介面有三個具體實現類,分別是雜湊集HashSet、鏈式雜湊集LinkedHashSet和樹形集TreeSet。

在HashSet中,記憶體不夠怎麼辦:假設10的初始容量,0.7的載入因子,當記憶體達到7時,記憶體就會變為20。(預設初始容量為16和載入因子0.75)

這幾種set的區別是底層實現不同,導致效能特性不同:HashSet是陣列(HashMap實現),LinkedHashSet是連結串列,TreeSet是樹。
然後陣列的特性就是記憶體固定,每次快用完了需新開闢空間,再把舊的複製過去。再是中途插入刪除,後面所有的元素都要移動,所以很影響效率。但是有索引,所以讀取查詢效率較高
連結串列的特性是插入刪除很方便。
樹則是在排序上有優勢

3、Queue
佇列是一種先進先出的資料結構,元素在佇列末尾新增,在佇列頭部刪除。Queue介面擴充套件自Collection,並提供插入、提取、檢驗等操作。

介面Deque,是一個擴充套件自Queue的雙端佇列,它支援在兩端插入和刪除元素,因為LinkedList類實現了Deque介面,所以通常我們可以使用LinkedList來建立一個佇列。PriorityQueue類實現了一個優先佇列,優先佇列中元素被賦予優先順序,擁有高優先順序的先被刪除。

4、HashMap
採用陣列+連結串列實現,即使用連結串列處理衝突,同一hash值的連結串列都儲存在一個連結串列裡。
JDK1.8中,HashMap採用陣列+連結串列+紅黑樹實現,當連結串列長度超過閾值(8)時,將連結串列轉換為紅黑樹,這樣大大減少了查詢時間。(百度了一下紅黑樹:類似二叉平衡樹,因為平衡特性使得最壞的情況都有較高效率。之後還要好好細學紅黑樹)

5、LinkedHashMap
繼承HashMap,但是因為是連結串列實現,所以可以記錄順序

6、TreeMap
基於紅黑樹資料結構(所以待我學完基礎,第一件事就是要學紅黑樹)。適合索引排序

如果更新圖時不需要保持圖中元素的順序,就使用HashMap,如果需要保持圖中元素的插入順序或者訪問順序,就使用LinkedHashMap,如果需要使圖按照鍵值排序,就使用TreeMap。

7、Vector
與ArrayList基本一致,Vector使用了關鍵字synchronized將訪問和修改向量的方法都變成同步,支援多執行緒,但是在查詢、插入、刪除都很慢

8、Stack
棧類,特徵是先進後出。只在棧頂操作,記錄棧頂位置。

9、HashTable
儲存鍵值對,繼承Dictionary,執行緒安全,key和value都不可以為null。

Vector、Stack和HashTable效率都較其他低,但是均執行緒安全

10、ConcurrentHashMap
Jdk1.5之後出現,比HashMap執行緒安全、比HashTable效率高近16倍。Hashtable相當於是給整個table加了鎖,而ConcurrentHashMap則優化了鎖的粒度,我粗略看了下別人貼的原始碼,使用Segment各層級來細化鎖。這個也要在之後好好看看原始碼分析
這裡寫圖片描述

11、CopyOnWriteArrayList
CopyOnWriteArrayList即寫時複製的容器。通俗的理解是當我們往一個容器新增元素的時候,不直接往當前容器新增,而是先將當前容器進行Copy,複製出一個新的容器,然後新的容器裡新增元素,新增完元素之後,再將原容器的引用指向新的容器。是一個執行緒安全的List介面的實現,它使用了ReentrantLock鎖在新增的時候是需要加,否則多執行緒寫的時候會Copy出N個副本出來
但是有兩個問題:1、寫操作時記憶體佔用過高 2、資料不實時一致

總結一下:
1、紅黑樹不懂,引申到HashMap、TreeMap的底層和原始碼都不懂
2、Hash碰撞沒有深究
3、ConcurrentHashMap是如何加鎖的,也不搞明白

入門了再回頭仔細分析

相關文章