新聞中心
概覽
我們先來看一看java中所有集合的類關系圖。
這里面的類太多了,請放大看,如果放大還看不清,請再放大看,如果還是看不清,請放棄。
我們下面主要分成五個部分來逐個擊破。
List
List中的元素是有序的、可重復的,主要實現(xiàn)方式有動態(tài)數(shù)組和鏈表。
java中提供的List的實現(xiàn)主要有ArrayList、LinkedList、CopyOnWriteArrayList,另外還有兩個古老的類Vector和Stack。
關于List相關的問題主要有:
(1)ArrayList和LinkedList有什么區(qū)別?
(2)ArrayList是怎么擴容的?
(3)ArrayList插入、刪除、查詢元素的時間復雜度各是多少?
(4)怎么求兩個集合的并集、交集、差集?
(5)ArrayList是怎么實現(xiàn)序列化和反序列化的?
(6)集合的方法toArray()有什么問題?
(7)什么是fail-fast?
(8)LinkedList是單鏈表還是雙鏈表實現(xiàn)的?
(9)LinkedList除了作為List還有什么用處?
(10)LinkedList插入、刪除、查詢元素的時間復雜度各是多少?
(11)什么是隨機訪問?
(12)哪些集合支持隨機訪問?他們都有哪些共性?
(13)CopyOnWriteArrayList是怎么保證并發(fā)安全的?
(14)CopyOnWriteArrayList的實現(xiàn)采用了什么思想?
(15)CopyOnWriteArrayList是不是強一致性的?
(16)CopyOnWriteArrayList適用于什么樣的場景?
(17)CopyOnWriteArrayList插入、刪除、查詢元素的時間復雜度各是多少?
(18)CopyOnWriteArrayList為什么沒有size屬性?
(19)比較古老的集合Vector和Stack有什么缺陷?
關于List的問題大概就這么多,你都能回答上來嗎?
點擊下面鏈接可以直接到相應的章節(jié)查看:
死磕 Java集合之ArrayList源碼分析
死磕 java集合之LinkedList源碼分析
死磕 java集合之CopyOnWriteArrayList源碼分析
Map
Map是一種(key/value)的映射結構,其它語言里可能稱作字典(Dictionary),包括java早期也是叫做字典,Map中的元素是一個key只能對應一個value,不能存在重復的key。
java中提供的Map的實現(xiàn)主要有HashMap、LinkedHashMap、WeakHashMap、TreeMap、ConcurrentHashMap、ConcurrentSkipListMap,另外還有兩個比較古老的Map實現(xiàn)HashTable和Properties。
關于Map的問題主要有:
(1)什么是散列表?
(2)怎么實現(xiàn)一個散列表?
(3)java中HashMap實現(xiàn)方式的演進?
(4)HashMap的容量有什么特點?
(5)HashMap是怎么進行擴容的?
(6)HashMap中的元素是否是有序的?
(7)HashMap何時進行樹化?何時進行反樹化?
(8)HashMap是怎么進行縮容的?
(9)HashMap插入、刪除、查詢元素的時間復雜度各是多少?
(10)HashMap中的紅黑樹實現(xiàn)部分可以用其它數(shù)據(jù)結構代替嗎?
(11)LinkedHashMap是怎么實現(xiàn)的?
(12)LinkedHashMap是有序的嗎?怎么個有序法?
(13)LinkedHashMap如何實現(xiàn)LRU緩存淘汰策略?
(14)WeakHashMap使用的數(shù)據(jù)結構?
(15)WeakHashMap具有什么特性?
(16)WeakHashMap通常用來做什么?
(17)WeakHashMap使用String作為key是需要注意些什么?為什么?
(18)什么是弱引用?
(19)紅黑樹具有哪些特性?
(20)TreeMap就有序的嗎?怎么個有序法?
(21)TreeMap是否需要擴容?
(22)什么是左旋?什么是右旋?
(23)紅黑樹怎么插入元素?
(24)紅黑樹怎么刪除元素?
(25)為什么要進行平衡?
(26)如何實現(xiàn)紅黑樹的遍歷?
(27)TreeMap中是怎么遍歷的?
(28)TreeMap插入、刪除、查詢元素的時間復雜度各是多少?
(29)HashMap在多線程環(huán)境中什么時候會出現(xiàn)問題?
(30)ConcurrentHashMap的存儲結構?
(31)ConcurrentHashMap是怎么保證并發(fā)安全的?
(32)ConcurrentHashMap是怎么擴容的?
(33)ConcurrentHashMap的size()方法的實現(xiàn)知多少?
(34)ConcurrentHashMap是強一致性的嗎?
(35)ConcurrentHashMap不能解決什么問題?
(36)ConcurrentHashMap中哪些地方運用到分段鎖的思想?
(37)什么是偽共享?怎么避免偽共享?
(38)什么是跳表?
(40)ConcurrentSkipList是有序的嗎?
(41)ConcurrentSkipList是如何保證線程安全的?
(42)ConcurrentSkipList插入、刪除、查詢元素的時間復雜度各是多少?
(43)ConcurrentSkipList的索引具有什么特性?
(44)為什么Redis選擇使用跳表而不是紅黑樹來實現(xiàn)有序集合?
關于Map的問題大概就這么多,你都能回答上來嗎?
點擊下面鏈接可以直接到相應的章節(jié)查看:
死磕 java集合之HashMap源碼分析
死磕 java集合之LinkedHashMap源碼分析
死磕 java集合之WeakHashMap源碼分析
死磕 java集合之TreeMap源碼分析(一)
死磕 java集合之TreeMap源碼分析(二)
死磕 java集合之TreeMap源碼分析(三)
死磕 java集合之TreeMap源碼分析(四)
死磕 java集合之ConcurrentHashMap源碼分析(一)
死磕 java集合之ConcurrentHashMap源碼分析(二)
死磕 java集合之ConcurrentHashMap源碼分析(三)
死磕 java集合之ConcurrentSkipListMap源碼分析
Set
java里面的Set對應于數(shù)學概念上的集合,里面的元素是不可重復的,通常使用Map或者List來實現(xiàn)。
java中提供的Set的實現(xiàn)主要有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有什么區(qū)別和聯(lián)系?
(12)CopyOnWriteArraySet是用Map實現(xiàn)的嗎?
(13)CopyOnWriteArraySet是有序的嗎?怎么個有序法?
(14)CopyOnWriteArraySet怎么保證并發(fā)安全?
(15)CopyOnWriteArraySet以何種方式保證元素不重復?
(16)如何比較兩個Set中的元素是否完全一致?
(17)ConcurrentSkipListSet的底層是ConcurrentSkipListMap嗎?
(18)ConcurrentSkipListSet是有序的嗎?怎么個有序法?
關于Set的問題大概就這么多,你都能回答上來嗎?
點擊下面鏈接可以直接到相應的章節(jié)查看:
死磕 java集合之HashSet源碼分析
死磕 java集合之LinkedHashSet源碼分析
死磕 java集合之TreeSet源碼分析
死磕 java集合之CopyOnWriteArraySet源碼分析
死磕 java集合之ConcurrentSkipListSet源碼分析
Queue
Queue是一種叫做隊列的數(shù)據(jù)結構,隊列是遵循著一定原則的入隊出隊操作的集合,一般來說,入隊是在隊列尾添加元素,出隊是在隊列頭刪除元素,但是,也不一定,比如優(yōu)先級隊列的原則就稍微有些不同。
java中提供的Queue的實現(xiàn)主要有PriorityQueue、ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue、LinkedTransferQueue、DelayQueue、ConcurrentLinkedQueue。
關于Queue的問題主要有:
(1)什么是堆?什么是堆化?
(2)什么是優(yōu)先級隊列?
(3)PriorityQueue是怎么實現(xiàn)的?
(4)PriorityQueue是有序的嗎?
(5)PriorityQueue入隊、出隊的時間復雜度各是多少?
(6)PriorityQueue是否需要擴容?擴容規(guī)則呢?
(7)ArrayBlockingQueue的實現(xiàn)方式?
(8)ArrayBlockingQueue是否需要擴容?
(9)ArrayBlockingQueue怎么保證線程安全?
(9)ArrayBlockingQueue有什么缺點?
(10)LinkedBlockingQueue的實現(xiàn)方式?
(11)LinkedBlockingQueue是有界的還是×××的隊列?
(12)LinkedBlockingQueue怎么保證線程安全?
(13)LinkedBlockingQueue與ArrayBlockingQueue對比?
(14)SynchronousQueue的實現(xiàn)方式?
(15)SynchronousQueue真的是無緩沖的嗎?
(16)SynchronousQueue怎么保證線程安全?
(17)SynchronousQueue的公平模式和非公平模式有什么區(qū)別?
(18)SynchronousQueue在高并發(fā)情景下會有什么問題?
(19)PriorityBlockingQueue的實現(xiàn)方式?
(20)PriorityBlockingQueue是否需要擴容?
(21)PriorityBlockingQueue怎么保證線程安全?
(22)PriorityBlockingQueue為什么不需要notFull條件?
(23)什么是雙重隊列?
(24)LinkedTransferQueue是怎么實現(xiàn)阻塞隊列的?
(25)LinkedTransferQueue是怎么控制并發(fā)安全的?
(26)LinkedTransferQueue與SynchronousQueue有什么異同?
(27)ConcurrentLinkedQueue是阻塞隊列嗎?
(28)ConcurrentLinkedQueue如何保證并發(fā)安全?
(29)ConcurrentLinkedQueue能用于線程池嗎?
(30)DelayQueue是阻塞隊列嗎?
(31)DelayQueue的實現(xiàn)方式?
(32)DelayQueue主要用于什么場景?
關于Queue的問題大概就這么多,你都能回答上來嗎?
點擊下面鏈接可以直接到相應的章節(jié)查看:
死磕 java集合之PriorityQueue源碼分析
死磕 java集合之ArrayBlockingQueue源碼分析
死磕 java集合之LinkedBlockingQueue源碼分析
死磕 java集合之SynchronousQueue源碼分析
死磕 java集合之PriorityBlockingQueue源碼分析
死磕 java集合之LinkedTransferQueue源碼分析
死磕 java集合之ConcurrentLinkedQueue源碼分析
死磕 java集合之DelayQueue源碼分析
Deque
Deque是一種特殊的隊列,它的兩端都可以進出元素,故而得名雙端隊列(Double Ended Queue)。
java中提供的Deque的實現(xiàn)主要有ArrayDeque、LinkedBlockingDeque、ConcurrentLinkedDeque、LinkedList。
關于Deque的問題主要有:
(1)什么是雙端隊列?
(2)ArrayDeque是怎么實現(xiàn)雙端隊列的?
(3)ArrayDeque是有界的嗎?
(4)LinkedList與ArrayDeque的對比?
(5)雙端隊列是否可以作為棧使用?
(6)LinkedBlockingDeque是怎么實現(xiàn)雙端隊列的?
(7)LinkedBlockingDeque是怎么保證并發(fā)安全的?
(8)ConcurrentLinkedDeque是怎么實現(xiàn)雙端隊列的?
(9)ConcurrentLinkedDeque是怎么保證并發(fā)安全的?
(10)LinkedList是List和Deque的集合體?
關于Deque的問題大概就這么多,你都能回答上來嗎?
點擊下面鏈接可以直接到相應的章節(jié)查看(LinkedBlockingDeque和ConcurrentLinkedDeque跟相應的Queue的實現(xiàn)方式基本一致,所以筆者沒寫這兩個類的源碼分析):
死磕 java集合之ArrayDeque源碼分析
死磕 java集合之LinkedList源碼分析
總結
其實上面的問題很多都具有共性,我覺得以下幾個問題在看每個集合類的時候都要掌握清楚:
(1)使用的數(shù)據(jù)結構?
(2)添加元素、刪除元素的基本邏輯?
(3)是否是fail-fast的?
(4)是否需要擴容?擴容規(guī)則?
(5)是否有序?是按插入順序還是自然順序還是訪問順序?
(6)是否線程安全?
(7)使用的鎖?
(8)優(yōu)點?缺點?
(9)適用的場景?
(10)時間復雜度?
(11)空間復雜度?
(12)還有呢?
彩蛋
到這里整個集合的內容就全部完畢了,其實看了這么多集合的源碼之后,筆者發(fā)現(xiàn),基本上所有集合類使用的數(shù)據(jù)結構都是數(shù)組和鏈表,包括樹和跳表也可以看成是鏈表的一種方式。
對于并發(fā)安全的集合,還要再加上相應的鎖策略,要不就是重入鎖,要不就是CAS+自旋,偶爾也來個synchronized。
所以,掌握集合的源碼不算什么,數(shù)據(jù)結構和鎖才是王道。
預告:下一個專題是java并發(fā)包,也就是著名的JUC,當然這里是除了并發(fā)集合以外的內容,也就是原子類、各種鎖、線程池三塊硬骨頭。
歡迎關注我的公眾號“彤哥讀源碼”,查看更多源碼系列文章, 與彤哥一起暢游源碼的海洋。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
網(wǎng)頁標題:死磕java集合之終結篇-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://fisionsoft.com.cn/article/dpdooj.html