1. 程式人生 > >Java集合體繫結構分析與比較

Java集合體繫結構分析與比較

1.  Java集合框架圖

Java平臺提供了一個全新的集合框架。“集合框架”主要由一組用來操作物件的介面組成。不同介面描述一組不同資料型別。

Java集合框架圖如下:

 

集合介面:6個介面(短虛線表示),表示不同集合型別,是集合框架的基礎。

抽象類:5個抽象類(長虛線表示),對集合介面的部分實現。可擴充套件為自定義集合類。

實現類:8個實現類(實線表示),對介面的具體實現。

在很大程度上,一旦您理解了介面,您就理解了框架。雖然您總要建立介面特定的實現,但訪問實際集合的方法應該限制在介面方法的使用上;因此,允許您更改基本的資料結構而不必改變其它程式碼。

Java集合的頂層介面是Collection,Collection 介面是一組允許重複的物件。Java集合框架主要由以下三個介面組成:

(1) Set 介面繼承Collection,但不允許重複,使用自己內部的一個排列機制。

(2) List 介面繼承Collection,允許重複,以元素安插的次序來放置元素,不會重新排列。

(3) Map介面是一組成對的鍵-值物件,即所持有的是key-value pairs。Map中不能有重複的key,擁有自己的內部排列機制。

容器中的元素型別都為Object,從容器取得元素時,必須把它轉換成原來的型別。簡化後的集合框架圖如下:


2.  介面Collection

用於表示任何物件或元素組,想要儘可能以常規方式處理一組元素時,就使用這一介面。

(1)單元素新增、刪除操作:

booleanadd(Object o):將物件新增給集合

booleanremove(Object o): 如果集合中有與o相匹配的物件,則刪除物件o

(2)查詢操作:

intsize():返回當前集合中元素的數量

booleanisEmpty():判斷集合中是否有任何元素

booleancontains(Object o):查詢集合中是否含有物件o

Iteratoriterator():返回一個迭代器,用來訪問集合中的各個元素

(3)組操作:作用於元素組或整個集合

booleancontainsAll(Collection c):

查詢集合中是否含有集合c中所有元素

booleanaddAll(Collection c) : 將集合c中所有元素新增給該集合

voidclear(): 刪除集合中所有元素

voidremoveAll(Collection c) : 從集合中刪除集合c中的所有元素

voidretainAll(Collection c) : 從集合中刪除集合c中不包含的元素

(4)Collection轉換為Object陣列:

Object[]toArray():返回一個內含集合所有元素的array

Object[]toArray(Object[]a):返回一個內含集合所有元素的array。執行期返回的array和引數a的型別相同,需要轉換為正確型別。

此外,您還可以把集合轉換成其它任何其它的物件陣列。但是,您不能直接把集合轉換成基本資料型別的陣列,因為集合必須持有物件。

斜體介面方法是可選的。因為一個介面實現必須實現所有介面方法,呼叫程式就需要一種途徑來知道一個可選的方法是不是不受支援。如果呼叫一種可選方法時,一個UnsupportedOperationException被丟擲,則操作失敗,因為方法不受支援。此異常類繼承RuntimeException類,避免了將所有集合操作放入try-catch塊。

Collection不提供get()方法。如果要遍歷Collectin中的元素,就必須用Iterator

2.1 抽象類AbstractCollection

AbstractCollection類提供具體“集合框架”類的基本功能。雖然您可以自行實現Collection介面的所有方法,但是,除了iterator()size()方法在恰當的子類中實現以外,其它所有方法都由AbstractCollection類來提供實現。如果子類不覆蓋某些方法,可選的如add()之類的方法將丟擲異常。

2.2 介面Iterator

Collection介面的iterator()方法返回一個IteratorIterator介面方法能以迭代方式逐個訪問集合中各個元素,並安全的從Collection中除去適當的元素。

(1)boolean hasNext(): 判斷是否存在另一個可訪問的元素

Objectnext(): 返回要訪問的下一個元素。如果到達集合結尾,則丟擲NoSuchElementException異常。

(2)void  remove():刪除上次訪問返回的物件。本方法必須緊跟在一個元素的訪問後執行。如果上次訪問後集合已被修改,方法將丟擲IllegalStateException

Iterator中刪除操作對底層Collection也有影響。

迭代器是故障快速修復(fail-fast)的。這意味著,當另一個執行緒修改底層集合的時候,如果您正在用Iterator遍歷集合,那麼,Iterator就會丟擲ConcurrentModificationException(一種RuntimeException異常)異常並立刻失敗。

在遍歷Iterator時不能對底層Collection執行remove()操作。

3. 介面List

List介面繼承了Collection介面以定義一個允許重複項的有序集合。該介面不但能夠對列表的一部分進行處理,還添加了面向位置的操作。

(1) 面向位置的操作包括插入某個元素或Collection的功能,還包括獲取、除去或更改元素的功能。在List中搜索元素可以從列表的頭部或尾部開始,如果找到元素,還將報告元素所在的位置:

voidadd(int index, Object element): 在指定位置index上新增元素element

booleanaddAll(int index, Collection c): 將集合c的所有元素新增到指定位置index

Objectget(int index): 返回List中指定位置的元素

intindexOf(Object o): 返回第一個出現元素o的位置,否則返回-1

intlastIndexOf(Object o):返回最後一個出現元素o的位置,否則返回-1

Objectremove(int index) :刪除指定位置上的元素

Objectset(int index, Object element):用元素element取代位置index上的元素,並且返回舊的元素

(2)List 介面不但以位置序列迭代的遍歷整個列表,還能處理集合的子集:

ListIteratorlistIterator() : 返回一個列表迭代器,用來訪問列表中的元素

ListIteratorlistIterator(int index) : 返回一個列表迭代器,用來從指定位置index開始訪問列表中的元素

ListsubList(int fromIndex, inttoIndex):返回從指定位置fromIndex(包含)到toIndex(不包含)範圍中各個元素的列表檢視

對子列表的更改(如add()remove()set()呼叫)對底層List也有影響。

3.1 介面ListIterator

ListIterator介面繼承Iterator介面以支援新增或更改底層集合中的元素,還支援雙向訪問。ListIterator沒有當前位置,游標位於呼叫previousnext方法返回的值之間。一個長度為n的列表,有n+1個有效索引值:

(1)void add(Object o): 將物件o新增到當前位置的前面

voidset(Object o):用物件o替代nextprevious方法訪問的上一個元素。如果上次呼叫後列表結構被修改了,那麼將丟擲IllegalStateException異常。

(2) boolean hasPrevious(): 判斷向後迭代時是否有元素可訪問

Objectprevious():返回上一個物件

intnextIndex(): 返回下次呼叫next方法時將返回的元素的索引

intpreviousIndex(): 返回下次呼叫previous方法時將返回的元素的索引

3.2 抽象類AbstractListAbstractSequentialList

有兩個抽象的List實現類:AbstractListAbstractSequentialList。像AbstractSet類一樣,它們覆蓋了equals()hashCode()方法以確保兩個相等的集合返回相同的雜湊碼。若兩個列表大小相等且包含順序相同的相同元素,則這兩個列表相等。這裡的hashCode()實現在List介面定義中指定,而在這裡實現。

除了equals()hashCode()AbstractListAbstractSequentialList實現了其餘List方法的一部分。因為資料的隨機訪問和順序訪問是分別實現的,使得具體列表實現的建立更為容易。需要定義的一套方法取決於您希望支援的行為。您永遠不必親自提供的是iterator方法的實現。

3.3 LinkedListArrayListVector

在“集合框架”中有兩種常規的List實現:ArrayListLinkedList。使用兩種List實現的哪一種取決於您特定的需要。如果要支援隨機訪問,而不必在除尾部