1. 程式人生 > >java集合類之List

java集合類之List

概述

List是一種有序的集合介面。List的例項支援通過下標訪問元素,下標從0開始計數。List允許重複的元素(Set是不允許重複的元素的)。
需要注意的是:如果List的例項允許將例項本身作為元素,那麼該例項的equals和hashCode的意義將不再明確。

List定義了以下操作:

操作型別 方法 說明
Query int size();
boolean isEmpty();
boolean contains(Object o);
Iterator iterator();
Object[] toArray();
T[] toArray(T[] a);
Modification boolean add(E e);
boolean remove(Object o);
Bulk Modification boolean containsAll(Collection c);
boolean addAll(Collection c);
boolean addAll(int index, Collection c);
boolean removeAll(Collection c);
boolean retainAll(Collection c);
void replaceAll(UnaryOperator operator);
void sort(Comparator c);
void clear();
Comparison and hashing boolean equals(Object o);
int hashCode();
Positional Access E get(int index);
E set(int index, E element);
void add(int index, E element);
E remove(int index);
基於下標的訪問
Search int indexOf(Object o);
int lastIndexOf(Object o);
List Iterators ListIterator listIterator();
ListIterator listIterator(int index);
View List subList(int fromIndex, int toIndex);
Spliterator spliterator();



實現類包括:AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector

AbstractList

AbstractList抽象類實現了List的骨架。用於減輕實現隨機訪問型儲存資料List(如ArrayList)的工作。使用該類的策略如下:
1. 如果要實現一個不可變的list,只需繼承AbstractList並實現get(int)和size()方法。
2. 如果要實現一個可變的list,還需實現set(int, E)及可選的add(int, E)和remove(int)方法。
3. 一般要提供一個無參構造器和集合構造器。(見Collection介面的說明)
4. 不需要實現迭代器。

AbstractSequentialList

AbstractSequentialList實現了List的骨架,用於減輕實現順序訪問型List(如LinkedList)的工作。使用該類的策略如下:
1. 要實現一個list,只需繼承AbstractSequentialList並實現listIterator()和size()方法。
2. 要實現一個不可變的list,只需實現list iterator的hasNext, next, hasPrevious, previous和index方法。
3. 要實現一個可變的list,還需實現set方法。要實現一個可變size的list,還需實現list iterator的remove和add方法。
4. 一般要提供一個無參構造器和集合構造器。(見Collection介面的說明)

ArrayList

ArrayList是List介面的可變大小陣列類。是隨機訪問型List實現。除實現了所有List介面定義的方法外,還額外實現了一些運算元組容量的方法。ArrayList有一個capacity屬性,它是陣列能夠儲存元素的的最大尺寸。並且隨著元素的插入,capacity自動增長。其特性如下:
1. 允許null元素。
2. size、isEmpty、get、set、iterator、listIterator方法的執行在常量時間完成;add方法執行時間O(n)。其他操作執行線上性時間完成。
3. 加入元素(add方法),size自動增長。如果插入一個元素時list已滿,則重新分配的儲存空間為當前的1.5倍。
4. 該實現執行緒不安全。(與Vector類功能大致相當,而Vector類是線性安全的)
5. 可序列化

注意:
- 使用無參建構函式例項化的ArrayList物件,預設capacity為10。並且在插入第一個元素時才會分配這10個儲存空間。
- size增長重新分配儲存空間會將增長前的內容複製到新分配的空間前面。
- 如果要連續插入大量的元素,最好在插入之前通過ensureCapacity方法增加容量。否則會多次重新分配儲存空間。

AttributeList

AttributeList用於展示MBean的屬性。是ArrayList的一個子類。AttributeList不強制要求其元素是Attribute型別,但是在呼叫asList()方法後,插入非Attribute類物件,會丟擲IllegalArgumentException異常。這是一個用於MBean管理的專用類,這裡不過多敘述。

CopyOnWriteArrayList

CopyOnWriteArrayList是一種執行緒安全的ArrayList變種。其對list作出修改的所有操作都是在原陣列上進行了一個包含修改(add、set或remove)內容的全新拷貝。其內部指向陣列的引用(array)指向新的陣列的引用,原來的陣列被丟棄。每次修改操作都有記憶體拷貝,操作代價太大。因此該類的使用具有侷限性。其特性如下:
1. 執行緒安全。
2. 在遍歷操作遠遠多於修改操作的情況下,適合使用該類。其iterator是當前的一個快照(array引用),在iterator的生命週期中,其他執行緒對該list的修改將不會引起併發異常。但是iterator不支援修改值。
3. 允許null元素。

##### LinkedList
LinkedList是實現了List和Deque介面的雙向連結表類。是順序訪問型list。所有的操作都與雙向列表一樣能預期。內部使用Node來儲存元素。其具有以下特性:
1. 執行緒不安全。
2. 允許null元素。
3. 索引操作將從頭或從尾開始遍歷列表,具體從哪一邊開始以索引更靠近哪一邊為準。
4. 其按下標訪問元素(隨機訪問)效能不佳。

RoleList和RoleUnresolvedList

它們是ArrayList的子類。專用於表示Role物件(RoleUnresolved物件)。但其繼承的ArrayList模板的型別是Object而不是Role,所以其add、set、addAll方法有兩種:以Object型別作引數和以Role型別(或RoleUnresolved型別)作引數。
其特性同ArrayList。

Vector

Vector是可增長的陣列類,可通過index下標訪問元素。其size可以增長或收縮。因此Vector具有優化的儲存容量,由capacity和capacityIncrement引數管理。capacity至少等於Vector的size,每次增長的容量是capacityIncrement指定。如果要插入大量的元素,最後事先呼叫ensureCapacity(int)增長容量以減少重新分配儲存空間的操作。其無參建構函式的預設capacity是10,capacityIncrement是0(<=0 表示容量每次增長一倍)。具有隨機訪問特性。
Vector是執行緒安全的
除去容量增長由capacityIncrement指定和執行緒安全外,其餘同ArrayList。如不需要考慮執行緒安全問題則優先使用ArrayList。

Stack

Stack是一個LIFO(後入先出)的棧結構類。Stack是Vector的子類,它實現了額外的5個方法來將Vector擴充套件為一個棧。
- 棧通用的push、pop方法
- peek方法窺探棧頂元素
- empty方法檢查是否為空棧
- search方法檢查一個元素到棧頂的距離
當棧建立時是不包含元素的。
一個完整和一致性的棧是Deque介面和其例項。Deque介面例項應優先於Stack使用。


對於List類執行緒不安全的實現:
1. 如果多個執行緒同時訪問,並且至少有一個執行緒會在結構上修改列表,那麼必須在外部進行同步。通常使用封裝這個list的類的某個物件來同步,如果沒有則使用:
List list = Collections.synchronizedList(new XxxList(…));
2. 由iterator和listIterator返回的迭代器是fail-fast的。如果在迭代器建立之後list被結構化地修改(除迭代器自己的add或remove方法)。迭代器繼續遍歷將拋ConcurrentModificationException異常。
3. 迭代器的fail-fast行為不具有硬性保證,僅用於檢測錯誤。