咱們先來看一看java中全部集合的類關係圖。java
這裏面的類太多了,請放大看,若是放大還看不清,請再放大看,若是仍是看不清,請放棄。數組
咱們下面主要分紅五個部分來逐個擊破。緩存
List中的元素是有序的、可重複的,主要實現方式有動態數組和鏈表。安全
java中提供的List的實現主要有ArrayList、LinkedList、CopyOnWriteArrayList,另外還有兩個古老的類Vector和Stack。數據結構
關於List相關的問題主要有:多線程
(1)ArrayList和LinkedList有什麼區別?併發
(2)ArrayList是怎麼擴容的?高併發
(3)ArrayList插入、刪除、查詢元素的時間複雜度各是多少?源碼分析
(4)怎麼求兩個集合的並集、交集、差集?ui
(5)ArrayList是怎麼實現序列化和反序列化的?
(6)集合的方法toArray()有什麼問題?
(7)什麼是fail-fast?
(8)LinkedList是單鏈表仍是雙鏈表實現的?
(9)LinkedList除了做爲List還有什麼用處?
(10)LinkedList插入、刪除、查詢元素的時間複雜度各是多少?
(11)什麼是隨機訪問?
(12)哪些集合支持隨機訪問?他們都有哪些共性?
(13)CopyOnWriteArrayList是怎麼保證併發安全的?
(14)CopyOnWriteArrayList的實現採用了什麼思想?
(15)CopyOnWriteArrayList是否是強一致性的?
(16)CopyOnWriteArrayList適用於什麼樣的場景?
(17)CopyOnWriteArrayList插入、刪除、查詢元素的時間複雜度各是多少?
(18)CopyOnWriteArrayList爲何沒有size屬性?
(19)比較古老的集合Vector和Stack有什麼缺陷?
關於List的問題大概就這麼多,你都能回答上來嗎?
點擊下面連接能夠直接到相應的章節查看:
死磕 java集合之CopyOnWriteArrayList源碼分析
Map是一種(key/value)的映射結構,其它語言裏可能稱做字典(Dictionary),包括java早期也是叫作字典,Map中的元素是一個key只能對應一個value,不能存在重複的key。
java中提供的Map的實現主要有HashMap、LinkedHashMap、WeakHashMap、TreeMap、ConcurrentHashMap、ConcurrentSkipListMap,另外還有兩個比較古老的Map實現HashTable和Properties。
關於Map的問題主要有:
(1)什麼是散列表?
(2)怎麼實現一個散列表?
(3)java中HashMap實現方式的演進?
(4)HashMap的容量有什麼特色?
(5)HashMap是怎麼進行擴容的?
(6)HashMap中的元素是不是有序的?
(7)HashMap什麼時候進行樹化?什麼時候進行反樹化?
(8)HashMap是怎麼進行縮容的?
(9)HashMap插入、刪除、查詢元素的時間複雜度各是多少?
(10)HashMap中的紅黑樹實現部分能夠用其它數據結構代替嗎?
(11)LinkedHashMap是怎麼實現的?
(12)LinkedHashMap是有序的嗎?怎麼個有序法?
(13)LinkedHashMap如何實現LRU緩存淘汰策略?
(14)WeakHashMap使用的數據結構?
(15)WeakHashMap具備什麼特性?
(16)WeakHashMap一般用來作什麼?
(17)WeakHashMap使用String做爲key是須要注意些什麼?爲何?
(18)什麼是弱引用?
(19)紅黑樹具備哪些特性?
(20)TreeMap就有序的嗎?怎麼個有序法?
(21)TreeMap是否須要擴容?
(22)什麼是左旋?什麼是右旋?
(23)紅黑樹怎麼插入元素?
(24)紅黑樹怎麼刪除元素?
(25)爲何要進行平衡?
(26)如何實現紅黑樹的遍歷?
(27)TreeMap中是怎麼遍歷的?
(28)TreeMap插入、刪除、查詢元素的時間複雜度各是多少?
(29)HashMap在多線程環境中何時會出現問題?
(30)ConcurrentHashMap的存儲結構?
(31)ConcurrentHashMap是怎麼保證併發安全的?
(32)ConcurrentHashMap是怎麼擴容的?
(33)ConcurrentHashMap的size()方法的實現知多少?
(34)ConcurrentHashMap是強一致性的嗎?
(35)ConcurrentHashMap不能解決什麼問題?
(36)ConcurrentHashMap中哪些地方運用到分段鎖的思想?
(37)什麼是僞共享?怎麼避免僞共享?
(38)什麼是跳錶?
(40)ConcurrentSkipList是有序的嗎?
(41)ConcurrentSkipList是如何保證線程安全的?
(42)ConcurrentSkipList插入、刪除、查詢元素的時間複雜度各是多少?
(43)ConcurrentSkipList的索引具備什麼特性?
(44)爲何Redis選擇使用跳錶而不是紅黑樹來實現有序集合?
關於Map的問題大概就這麼多,你都能回答上來嗎?
點擊下面連接能夠直接到相應的章節查看:
死磕 java集合之ConcurrentHashMap源碼分析(一)
死磕 java集合之ConcurrentHashMap源碼分析(二)
死磕 java集合之ConcurrentHashMap源碼分析(三)
死磕 java集合之ConcurrentSkipListMap源碼分析
java裏面的Set對應於數學概念上的集合,裏面的元素是不可重複的,一般使用Map或者List來實現。
java中提供的Set的實現主要有HashSet、LinkedHashSet、TreeSet、CopyOnWriteArraySet、ConcurrentSkipSet。
關於Set的問題主要有:
(1)HashSet怎麼保證添加元素不重複?
(2)HashSet是有序的嗎?
(3)HashSet是否容許null元素?
(4)Set是否有get()方法?
(5)LinkedHashSet是有序的嗎?怎麼個有序法?
(6)LinkedHashSet支持按元素訪問順序排序嗎?
(8)TreeSet真的是使用TreeMap來存儲元素的嗎?
(9)TreeSet是有序的嗎?怎麼個有序法?
(10)TreeSet和LinkedHashSet有何不一樣?
(11)TreeSet和SortedSet有什麼區別和聯繫?
(12)CopyOnWriteArraySet是用Map實現的嗎?
(13)CopyOnWriteArraySet是有序的嗎?怎麼個有序法?
(14)CopyOnWriteArraySet怎麼保證併發安全?
(15)CopyOnWriteArraySet以何種方式保證元素不重複?
(16)如何比較兩個Set中的元素是否徹底一致?
(17)ConcurrentSkipListSet的底層是ConcurrentSkipListMap嗎?
(18)ConcurrentSkipListSet是有序的嗎?怎麼個有序法?
關於Set的問題大概就這麼多,你都能回答上來嗎?
點擊下面連接能夠直接到相應的章節查看:
死磕 java集合之CopyOnWriteArraySet源碼分析
死磕 java集合之ConcurrentSkipListSet源碼分析
Queue是一種叫作隊列的數據結構,隊列是遵循着必定原則的入隊出隊操做的集合,通常來講,入隊是在隊列尾添加元素,出隊是在隊列頭刪除元素,可是,也不必定,好比優先級隊列的原則就稍微有些不一樣。
java中提供的Queue的實現主要有PriorityQueue、ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue、LinkedTransferQueue、DelayQueue、ConcurrentLinkedQueue。
關於Queue的問題主要有:
(1)什麼是堆?什麼是堆化?
(2)什麼是優先級隊列?
(3)PriorityQueue是怎麼實現的?
(4)PriorityQueue是有序的嗎?
(5)PriorityQueue入隊、出隊的時間複雜度各是多少?
(6)PriorityQueue是否須要擴容?擴容規則呢?
(7)ArrayBlockingQueue的實現方式?
(8)ArrayBlockingQueue是否須要擴容?
(9)ArrayBlockingQueue怎麼保證線程安全?
(9)ArrayBlockingQueue有什麼缺點?
(10)LinkedBlockingQueue的實現方式?
(11)LinkedBlockingQueue是有界的仍是無界的隊列?
(12)LinkedBlockingQueue怎麼保證線程安全?
(13)LinkedBlockingQueue與ArrayBlockingQueue對比?
(14)SynchronousQueue的實現方式?
(15)SynchronousQueue真的是無緩衝的嗎?
(16)SynchronousQueue怎麼保證線程安全?
(17)SynchronousQueue的公平模式和非公平模式有什麼區別?
(18)SynchronousQueue在高併發情景下會有什麼問題?
(19)PriorityBlockingQueue的實現方式?
(20)PriorityBlockingQueue是否須要擴容?
(21)PriorityBlockingQueue怎麼保證線程安全?
(22)PriorityBlockingQueue爲何不須要notFull條件?
(23)什麼是雙重隊列?
(24)LinkedTransferQueue是怎麼實現阻塞隊列的?
(25)LinkedTransferQueue是怎麼控制併發安全的?
(26)LinkedTransferQueue與SynchronousQueue有什麼異同?
(27)ConcurrentLinkedQueue是阻塞隊列嗎?
(28)ConcurrentLinkedQueue如何保證併發安全?
(29)ConcurrentLinkedQueue能用於線程池嗎?
(30)DelayQueue是阻塞隊列嗎?
(31)DelayQueue的實現方式?
(32)DelayQueue主要用於什麼場景?
關於Queue的問題大概就這麼多,你都能回答上來嗎?
點擊下面連接能夠直接到相應的章節查看:
死磕 java集合之ArrayBlockingQueue源碼分析
死磕 java集合之LinkedBlockingQueue源碼分析
死磕 java集合之SynchronousQueue源碼分析
死磕 java集合之PriorityBlockingQueue源碼分析
死磕 java集合之LinkedTransferQueue源碼分析
死磕 java集合之ConcurrentLinkedQueue源碼分析
Deque是一種特殊的隊列,它的兩端均可以進出元素,故而得名雙端隊列(Double Ended Queue)。
java中提供的Deque的實現主要有ArrayDeque、LinkedBlockingDeque、ConcurrentLinkedDeque、LinkedList。
關於Deque的問題主要有:
(1)什麼是雙端隊列?
(2)ArrayDeque是怎麼實現雙端隊列的?
(3)ArrayDeque是有界的嗎?
(4)LinkedList與ArrayDeque的對比?
(5)雙端隊列是否能夠做爲棧使用?
(6)LinkedBlockingDeque是怎麼實現雙端隊列的?
(7)LinkedBlockingDeque是怎麼保證併發安全的?
(8)ConcurrentLinkedDeque是怎麼實現雙端隊列的?
(9)ConcurrentLinkedDeque是怎麼保證併發安全的?
(10)LinkedList是List和Deque的集合體?
關於Deque的問題大概就這麼多,你都能回答上來嗎?
點擊下面連接能夠直接到相應的章節查看(LinkedBlockingDeque和ConcurrentLinkedDeque跟相應的Queue的實現方式基本一致,因此筆者沒寫這兩個類的源碼分析):
其實上面的問題不少都具備共性,我以爲如下幾個問題在看每一個集合類的時候都要掌握清楚:
(1)使用的數據結構?
(2)添加元素、刪除元素的基本邏輯?
(3)是不是fail-fast的?
(4)是否須要擴容?擴容規則?
(5)是否有序?是按插入順序仍是天然順序仍是訪問順序?
(6)是否線程安全?
(7)使用的鎖?
(8)優勢?缺點?
(9)適用的場景?
(10)時間複雜度?
(11)空間複雜度?
(12)還有呢?
到這裏整個集合的內容就所有完畢了,其實看了這麼多集合的源碼以後,筆者發現,基本上全部集合類使用的數據結構都是數組和鏈表,包括樹和跳錶也能夠當作是鏈表的一種方式。
對於併發安全的集合,還要再加上相應的鎖策略,要不就是重入鎖,要不就是CAS+自旋,偶爾也來個synchronized。
因此,掌握集合的源碼不算什麼,數據結構和鎖纔是王道。
預告:下一個專題是java併發包,也就是著名的JUC,固然這裏是除了併發集合之外的內容,也就是原子類、各類鎖、線程池三塊硬骨頭。
歡迎關注個人公衆號「彤哥讀源碼」,查看更多源碼系列文章, 與彤哥一塊兒暢遊源碼的海洋。