1. 程式人生 > >JAVA常用集合框架原始碼解析(基於1.8)開題篇

JAVA常用集合框架原始碼解析(基於1.8)開題篇

倪升武的部落格中有一個小專題,讀完之後,發現博主的分析基本是基於JAVA1.7的,這裡我基於JAVA1.8給出一些新的解讀。但是對於JAVA1.8新增的一些新特性可能不太會作過多的分析(畢竟本人目前水平有限,且本部落格的寫作初衷也是以基礎學習為主),在徹底淺讀完JAVA1.8集合部分之前,我無法瞭解JAVA1.7與1.8之間關於集合框架的改動到底會有多少,因此可能產生某些個人理解上的不當,希望大家可以予以指正。

集合分類

1.Collection框架

首先是一個Collection框架圖:
這裡寫圖片描述

標註:從網上看過好多圖片,分類是比較明確,但是感覺圖不夠醒目清晰,因此我自己又重新畫了一個。有些集合類沒有畫出來(如Vector的子類Stack等),其他如有不當之處,敬請指正。上圖中,介面我用藍色字型矩形框

標示,抽象類用橙色橢圓形框標示,最終的實體類用紅色六邊形標示。另外,虛線標示實現(implements),實線標示繼承(extends)。

  • 從圖中我們可以看出,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異常。