堅持有空就寫點東西,算是回顧復(fù)習。
Java集合框架下大致可以分為如下五個部分:List列表、Set集合、Map映射、迭代器(Iterator、Enumeration)、工具類(Arrays、Collections)。
這篇簡單介紹下java的集合框架,各個集合類會單獨有源碼分析文章
Java集合類的整體框架如下:
從上圖中可以看出(圖中有誤,Map不依賴于Collection,public interface Map<K, V> {....}),集合類主要分為兩大類:Collection和Map。
-
Collection接口
Collection是List、Set等集合高度抽象出來的接口,它包含了這些集合的基本操作,它主要又分為兩大部分:List和Set。
List接口
List是有序的Collection,使用此接口能夠精確的控制每個元素插入的位置。用戶能夠使用索引(元素在List中的位置,類似于數(shù)組下標)來訪問List中的元素,這類似于Java的數(shù)組。和下面要提到的Set不同,List允許有相同的元素。
除了具有Collection接口必備的iterator()方法外,List還提供一個listIterator()方法,返回一個ListIterator接口,和標準的Iterator接口相比,ListIterator多了一些add()之類的方法,允許添加,刪除,設(shè)定元素,還能向前或向后遍歷。
實現(xiàn)List接口的常用類有LinkedList,ArrayList,Vector和Stack。
Set接口
Set是一種不包含重復(fù)的元素的Collection,即任意的兩個元素e1和e2都有e1.equals(e2)=false,Set最多有一個null元素。
很明顯,Set的構(gòu)造函數(shù)有一個約束條件,傳入的Collection參數(shù)不能包含重復(fù)的元素。請注意:必須小心操作可變對象(Mutable Object)。如果一個Set中的可變元素改變了自身狀態(tài)導(dǎo)致Object.equals(Object)=true將導(dǎo)致一些問題。
Set接口通常表示一個集合,其中的元素不允許重復(fù)(通過hashcode和equals函數(shù)保證),常用實現(xiàn)類有HashSet和TreeSet,HashSet是通過Map中的HashMap實現(xiàn)的,而TreeSet是通過Map中的TreeMap實現(xiàn)的。另外,TreeSet還實現(xiàn)了SortedSet接口,因此是有序的集合(集合中的元素要實現(xiàn)Comparable接口,并覆寫Compartor函數(shù)才行)。
我們看到,抽象類AbstractCollection、AbstractList和AbstractSet分別實現(xiàn)了Collection、List和Set接口,這就是在Java集合框架中用的很多的適配器設(shè)計模式,用這些抽象類去實現(xiàn)接口,在抽象類中實現(xiàn)接口中的若干或全部方法,這樣下面的一些類只需直接繼承該抽象類,并實現(xiàn)自己需要的方法即可,而不用實現(xiàn)接口中的全部抽象方法。
-
Map接口
請注意,Map沒有繼承Collection接口,Map提供key到value的映射。一個Map中不能包含相同的key,每個key只能映射一個value。Map接口提供3種集合的視圖,Map的內(nèi)容可以被當作一組key集合,一組value集合,或者一組key-value映射。同樣抽象類AbstractMap通過適配器模式實現(xiàn)了Map接口中的大部分函數(shù),TreeMap、HashMap、WeakHashMap等實現(xiàn)類都通過繼承AbstractMap來實現(xiàn),另外,不常用的HashTable直接實現(xiàn)了Map接口,它和Vector都是JDK1.0就引入的集合類。
-
Iterator接口
Iterator是遍歷集合的迭代器(不能遍歷Map,只用來遍歷Collection),Collection的實現(xiàn)類都實現(xiàn)了iterator()函數(shù),它返回一個Iterator對象,用來遍歷集合,ListIterator則專門用來遍歷List。而Enumeration則是JDK1.0時引入的,作用與Iterator相同,但它的功能比Iterator要少,它只能再Hashtable、Vector和Stack中使用。
-
Arrays和Collections工具類
Arrays和Collections是用來操作數(shù)組、集合的兩個工具類,例如在ArrayList和Vector中大量調(diào)用了Arrays.Copyof()方法,而Collections中有很多靜態(tài)方法可以返回各集合類的synchronized版本,即線程安全的版本,當然了,如果要用線程安全的結(jié)合類,首選Concurrent并發(fā)包下的對應(yīng)的集合類。
總體框架有了,接下來會整理一些各個集合類的源碼分析文章