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接口: