JAVA常用集合框架原始碼解析(基於1.8)開題篇
阿新 • • 發佈:2018-12-26
倪升武的部落格中有一個小專題,讀完之後,發現博主的分析基本是基於JAVA1.7的,這裡我基於JAVA1.8給出一些新的解讀。但是對於JAVA1.8新增的一些新特性可能不太會作過多的分析(畢竟本人目前水平有限,且本部落格的寫作初衷也是以基礎學習為主),在徹底淺讀完JAVA1.8集合部分之前,我無法瞭解JAVA1.7與1.8之間關於集合框架的改動到底會有多少,因此可能產生某些個人理解上的不當,希望大家可以予以指正。
集合分類
1.Collection框架
首先是一個Collection框架圖:
標註:從網上看過好多圖片,分類是比較明確,但是感覺圖不夠醒目清晰,因此我自己又重新畫了一個。有些集合類沒有畫出來(如Vector的子類Stack等),其他如有不當之處,敬請指正。上圖中,介面我用藍色字型矩形框
- 從圖中我們可以看出,Collection介面下共有Set、List、Queue三個子介面。由於後面我們要著重分析的是ArrayList、LinkedList、TreeSet、HashSet,因此我們不對Queue這個子介面做過多的解讀。
- List介面:List是一個有序的集合,每個元素都有索引且起始索引位置為0。
- Set介面:Set是一個無序的集合,而且Set中不允許有重複元素。HashSet和HashMap之間、TreeSet和TreeMap之間還有依賴關係,後面我們會講到。
2.Map框架
然後是一個Map框架圖:
- Map介面:主要用來處理對映關係的集合。其中的每一個元素都是一個鍵值對(Entry)。
- AbstractMap:實現Map的一個抽象類,Map中大多數方法都實現了。
- HashTable:由於歷史原因依舊繼承Directionary類,但是實現了Map介面。
3.集合框架中用到的一些類
- Iterator是遍歷集合的工具,我們通常使用Iterator迭代器來遍歷集合。Collection依賴於Iterator是因為Collection的實現類都要實現iterator()方法,返回一個Iterator物件。ListIterator是專門為遍歷Collection而存在的。
- Enumeration是JDK1.0引入的抽象類,作用和Iterator一樣,也是遍歷集合,但是Enumeration的功能要比Iterator少,在上面的框圖中,Enumeration只能在HashTable,Vector和Stack中使用。
小結:從上面的分類我們可以看出,Collection介面和Map是相互獨立的介面。另外,Array和Collections是2個有用的類,其內部實現了很多靜態的集合方法,Collections提供了一些列靜態方法以實現對各種集合的搜尋、排序、執行緒安全化等操作,其中大多數方法用來處理線性表。Collections類不能例項化,如同一個工具類,服務與Collection框架。若在使用Collections的方法時,對應的collection物件為null,那麼會丟擲NullPointerException異常。