java集合框架02——Collection架構與源碼分析

Collection是一個接口,它主要的兩個分支是List和Set。如下圖所示:

        List和Set都是接口,它們繼承與Collection。List是有序的隊列,可以用重複的元素;而Set是數學概念中的集合,不能有重複的元素。List和Set都有它們各自的實現類。

爲了方便,我們抽象出AbstractCollection類來讓其他類繼承,該類實現類Collection中的絕大部分方法。AbstractList和AbstractSet都繼承與AbstractCollection,具體的List實現類繼承與AbstractList,而Set的實現類則繼承與AbstractSet。

        另外,Collection中有個iterator()方法,它的作用是返回一個Iterator接口。通常,我們通過Iterator迭代器來遍歷集合。ListIterator是List接口所特有的,在List接口中,通過ListIterator()返回一個ListIterator對象。

        我們首先來閱讀下這些 接口和抽象類以及他們的實現類中都有哪些方法:

1. Collection

        Collection的定義如下:

public interface Collection<E> extends Iterable<E> {} 

 從它的定義中可以看出,Collection是一個接口。它是一個高度抽象出來的集合,包含了集合的基本操作:添加、刪除、清空、遍歷、是否爲空、獲取大小等。

        Collection接口的所有子類(直接子類和簡介子類)都必須實現2種構造函數:不帶參數的構造函數和參數爲Collection的構造函數。帶參數的構造函數可以用來轉換Collection的類型。下面是Collection接口中定義的API:

// Collection的API  
abstract boolean         add(E object)  
abstract boolean         addAll(Collection<? extends E> collection)  
abstract void            clear()  
abstract boolean         contains(Object object)  
abstract boolean         containsAll(Collection<?> collection)  
abstract boolean         equals(Object object)  
abstract int             hashCode()  
abstract boolean         isEmpty()  
abstract Iterator<E>     iterator()  
abstract boolean         remove(Object object)  
abstract boolean         removeAll(Collection<?> collection)  
abstract boolean         retainAll(Collection<?> collection)  
abstract int             size()  
abstract <T> T[]         toArray(T[] array)  
abstract Object[]        toArray()
 

2. List

        List的定義如下:

public interface List<E> extends Collection<E> {}

從List定義中可以看出,它繼承與Collection接口,即List是集合的一種。List是有序的隊列,List中的每一個元素都有一個索引,第一個元素的索引值爲0,往後的元素的索引值依次+1.,List中允許有重複的元素。

        List繼承Collection自然包含了Collection的所有接口,由於List是有序隊列,所以它也有自己額外的API接口。API如下:

 

// Collection的API  
abstract boolean         add(E object)  
abstract boolean         addAll(Collection<? extends E> collection)  
abstract void            clear()  
abstract boolean         contains(Object object)  
abstract boolean         containsAll(Collection<?> collection)  
abstract boolean         equals(Object object)  
abstract int             hashCode()  
abstract boolean         isEmpty()  
abstract Iterator<E>     iterator()  
abstract boolean         remove(Object object)  
abstract boolean         removeAll(Collection<?> collection)  
abstract boolean         retainAll(Collection<?> collection)  
abstract int             size()  
abstract <T> T[]         toArray(T[] array)  
abstract Object[]        toArray()  
// 相比與Collection,List新增的API:  
abstract void                add(int location, E object) //在指定位置添加元素  
abstract boolean             addAll(int location, Collection<? extends E> collection) //在指定位置添加其他集合中的元素  
abstract E                   get(int location) //獲取指定位置的元素  
abstract int                 indexOf(Object object) //獲得指定元素的索引  
abstract int                 lastIndexOf(Object object) //從右邊的索引  
abstract ListIterator<E>     listIterator(int location) //獲得iterator  
abstract ListIterator<E>     listIterator()  
abstract E                   remove(int location) //刪除指定位置的元素  
abstract E                   set(int location, E object) //修改指定位置的元素  
abstract List<E>             subList(int start, int end) //獲取子list  

 

3. Set

        Set的定義如下:


 

Set也繼承與Collection接口,且裏面不能有重複元素。關於API,Set與Collection的API完全一樣,不在贅述。

4. AbstractCollection

public interface Set<E> extends Collection<E> {}

 AbstractCollection是一個抽象類,它實現了Collection中除了iterator()和size()之外的所有方法。AbstractCollection的主要作用是方便其他類實現Collection.,比如ArrayList、LinkedList等。它們想要實現Collection接口,通過集成AbstractCollection就已經實現大部分方法了,再實現一下iterator()和size()即可。

        下面看一下AbstractCollection實現的部分方法的源碼:

複製代碼


 

複製代碼

5. AbstractList

        AbstractList的定義如下:


 

     從定義中可以看出,AbstractList是一個繼承AbstractCollection,並且實現了List接口的抽象類。它實現了List中除了size()、get(int location)之外的方法。

        AbstractList的主要作用:它實現了List接口中的大部分函數,從而方便其它類繼承List。另外,和AbstractCollection相比,AbstractList抽象類中,實現了iterator()方法。

        AbstractList抽象類的源碼如下:

6. AbstractSet

        AbstractSet的定義如下:


 

 AbstractSet是一個繼承與AbstractCollection,並且實現了Set接口的抽象類。由於Set接口和Collection接口中的API完全一樣,所以Set也就沒有自己單獨的API。和AbstractCollection一樣,它實現了List中除iterator()和size()外的方法。所以源碼和AbstractCollection的一樣。

 AbstractSet的主要作用:它實現了Set接口總的大部分函數,從而方便其他類實現Set接口。

7. Iterator

Iterator的定義如下:

 


 

 

  Iterator是一個接口,它是集合的迭代器。集合可以通過Iterator去遍歷其中的元素。Iterator提供的API接口包括:是否存在下一個元素,獲取下一個元素和刪除當前元素。

        注意:Iterator遍歷Collection時,是fail-fast機制的。即,當某一個線程A通過iterator去遍歷某集合的過程中,若該集合的內容被其他線程所改變了,那麼線程A訪問集合時,就會拋出CurrentModificationException異常,產生fail-fast事件。下面是Iterator的幾個API。


 

8. ListIterator

 ListIterator的定義如下:

 


 

 

ListIterator是一個繼承Iterator的接口,它是隊列迭代器。專門用於遍歷List,能提供向前和向後遍歷。相比於Iterator,它新增了添加、是否存在上一個元素、獲取上一個元素等API接口:

複製代碼


 

複製代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章