天天看點

Java 集合系列02之 Collection架構概要1 Collection簡介2 List簡介3 Set簡介4 AbstractCollection5 AbstractList6 AbstractSet7 Iterator8 ListIterator上一篇:Java 集合系列01之 總體架構下一篇:Java 集合系列03之 ArrayList詳細介紹(源碼解析)和使用示例

概要

首先,我們對Collection進行說明。下面先看看Collection的一些架構類的關系圖:

Java 集合系列02之 Collection架構概要1 Collection簡介2 List簡介3 Set簡介4 AbstractCollection5 AbstractList6 AbstractSet7 Iterator8 ListIterator上一篇:Java 集合系列01之 總體架構下一篇:Java 集合系列03之 ArrayList詳細介紹(源碼解析)和使用示例

Collection是一個接口,它主要的兩個分支是:List 和 Set。

List和Set都是接口,它們繼承于Collection。List是有序的隊列,List中可以有重複的元素;而Set是數學概念中的集合,Set中沒有重複元素!

List和Set都有它們各自的實作類。

為了友善,我們抽象出了AbstractCollection抽象類,它實作了Collection中的絕大部分函數;這樣,在Collection的實作類中,我們就可以通過繼承AbstractCollection省去重複編碼。AbstractList和AbstractSet都繼承于AbstractCollection,具體的List實作類繼承于AbstractList,而Set的實作類則繼承于AbstractSet。

另外,Collection中有一個iterator()函數,它的作用是傳回一個Iterator接口。通常,我們通過Iterator疊代器來周遊集合。ListIterator是List接口所特有的,在List接口中,通過ListIterator()傳回一個ListIterator對象。

接下來,我們看看各個接口和抽象類的介紹;然後,再對實作類進行詳細的了解。

本章内容包括:

1 Collection簡介

2 List簡介

3 Set簡介

4 AbstractCollection

5 AbstractList

6 AbstractSet

7 Iterator

8 ListIterator

1 Collection簡介

Collection的定義如下:

它是一個接口,是高度抽象出來的集合,它包含了集合的基本操作:添加、删除、清空、周遊(讀取)、是否為空、擷取大小、是否保護某元素等等。

Collection接口的所有子類(直接子類和間接子類)都必須實作2種構造函數:不帶參數的構造函數 和 參數為Collection的構造函數。帶參數的構造函數,可以用來轉換Collection的類型。

// 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的定義如下:

List是一個繼承于Collection的接口,即List是集合中的一種。List是有序的隊列,List中的每一個元素都有一個索引;第一個元素的索引值是0,往後的元素的索引值依次+1。和Set不同,List中允許有重複的元素。

List的官方介紹如下:

A List is a collection which maintains an ordering for its elements. 
Every element in the List has an index. 
Each element can thus be accessed by its index, with the first index being zero. 
Normally, Lists allow duplicate elements, as compared to Sets, where elements have to be unique.

/*清單是一個集合,它維護其元素的順序。
清單中的每個元素都有一個索引。
是以,每個元素都可以通過其索引通路,第一個索引為零。
通常,清單允許複制元素,而集合中元素必須是惟一的。*/
           

關于API方面。既然List是繼承于Collection接口,它自然就包含了Collection中的全部函數接口;由于List是有序隊列,它也額外的有自己的API接口。主要有“添加、删除、擷取、修改指定位置的元素”、“擷取List中的子隊列”等。

// 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)
abstract ListIterator<E>     listIterator()
abstract E                   remove(int location)
abstract E                   set(int location, E object)
abstract List<E>             subList(int start, int end)
           

3 Set簡介

Set的定義如下:

Set是一個繼承于Collection的接口,即Set也是集合中的一種。Set是沒有重複元素的集合。

關于API方面。Set的API和Collection完全一樣。

// Set的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()
           

4 AbstractCollection

AbstractCollection的定義如下:

AbstractCollection是一個抽象類,它實作了Collection中除iterator()和size()之外的函數。

AbstractCollection的主要作用:它實作了Collection接口中的大部分函數。進而友善其它類實作Collection,比如ArrayList、LinkedList等,它們這些類想要實作Collection接口,通過繼承AbstractCollection就已經實作了大部分的接口了。

5 AbstractList

AbstractList的定義如下:

AbstractList是一個繼承于AbstractCollection,并且實作List接口的抽象類。它實作了List中除size()、get(int location)之外的函數。

AbstractList的主要作用:它實作了List接口中的大部分函數。進而友善其它類繼承List。

另外,和AbstractCollection相比,AbstractList抽象類中,實作了iterator()接口。

6 AbstractSet

AbstractSet的定義如下:

AbstractSet是一個繼承于AbstractCollection,并且實作Set接口的抽象類。由于Set接口和Collection接口中的API完全一樣,Set也就沒有自己單獨的API。和AbstractCollection一樣,它實作了List中除iterator()和size()之外的函數。

AbstractSet的主要作用:它實作了Set接口中的大部分函數。進而友善其它類實作Set接口。

7 Iterator

Iterator的定義如下:

Iterator是一個接口,它是集合的疊代器。集合可以通過Iterator去周遊集合中的元素。Iterator提供的API接口,包括:是否存在下一個元素、擷取下一個元素、删除目前元素。

注意:Iterator周遊Collection時,是fail-fast機制的。即,當某一個線程A通過iterator去周遊某集合的過程中,若該集合的内容被其他線程所改變了;那麼線程A通路集合時,就會抛出ConcurrentModificationException異常,産生fail-fast事件。關于fail-fast的詳細内容,我們會在後面專門進行說明。TODO

// Iterator的API
abstract boolean hasNext()
abstract E next()
abstract void remove()
           

8 ListIterator

ListIterator的定義如下:

ListIterator是一個繼承于Iterator的接口,它是隊列疊代器。專門用于便利List,能提供向前/向後周遊。相比于Iterator,它新增了添加、是否存在上一個元素、擷取上一個元素等等API接口。

// ListIterator的API
// 繼承于Iterator的接口
abstract boolean hasNext()
abstract E next()
abstract void remove()
// 新增API接口
abstract void add(E object)
abstract boolean hasPrevious()
abstract int nextIndex()
abstract E previous()
abstract int previousIndex()
abstract void set(E object)
           

上一篇:Java 集合系列01之 總體架構

下一篇:Java 集合系列03之 ArrayList詳細介紹(源碼解析)和使用示例