List 介面繼承了 Collection 介面以定義一個允許重複項的有序集合。該介面不但能夠對列表的一部分進行處理,還添加了面向位置的操作。 (1) 面向位置的操作包括插入某個元素或 Collection 的功能,還包括獲取、除去或更改元素的功能。在 List 中搜索元素可以從列表的頭部或尾部開始,如果找到元素,還將報告元素所在的位置 : void add(int index, Object element): 在指定位置index上新增元素element boolean addAll(int index, Collection c): 將集合c的所有元素新增到指定位置index Object get(int index): 返回List中指定位置的元素 int indexOf(Object o): 返回第一個出現元素o的位置,否則返回-1 int lastIndexOf(Object o) :返回最後一個出現元素o的位置,否則返回-1 Object remove(int index) :刪除指定位置上的元素 Object set(int index, Object element) :用元素element取代位置index上的元素,並且返回舊的元素 (2) List 介面不但以位置序列迭代的遍歷整個列表,還能處理集合的子集: ListIterator listIterator() : 返回一個列表迭代器,用來訪問列表中的元素 ListIterator listIterator(int index) : 返回一個列表迭代器,用來從指定位置index開始訪問列表中的元素 List subList(int fromIndex, int toIndex) :返回從指定位置fromIndex(包含)到toIndex(不包含)範圍中各個元素的列表檢視 “對子列表的更改(如 add()、remove() 和 set() 呼叫)對底層 List 也有影響。” 2.1.ListIterator介面 ListIterator 介面繼承 Iterator 介面以支援新增或更改底層集合中的元素,還支援雙向訪問。ListIterator沒有當前位置,游標位於呼叫previous和next方法返回的值之間。一個長度為n的列表,有n+1個有效索引值: (1) void add(Object o): 將物件o新增到當前位置的前面 void set(Object o): 用物件o替代next或previous方法訪問的上一個元素。如果上次呼叫後列表結構被修改了,那麼將丟擲IllegalStateException異常。 (2) boolean hasPrevious(): 判斷向後迭代時是否有元素可訪問 Object previous():返回上一個物件 int nextIndex(): 返回下次呼叫next方法時將返回的元素的索引 int previousIndex(): 返回下次呼叫previous方法時將返回的元素的索引 “正常情況下,不用ListIterator改變某次遍歷集合元素的方向 — 向前或者向後。雖然在技術上可以實現,但previous() 後立刻呼叫next(),返回的是同一個元素。把呼叫 next()和previous()的順序顛倒一下,結果相同。” “我們還需要稍微再解釋一下 add() 操作。新增一個元素會導致新元素立刻被新增到隱式游標的前面。因此,新增元素後呼叫 previous() 會返回新元素,而呼叫 next() 則不起作用,返回新增操作之前的下一個元素。” 2.2.AbstractList和AbstractSequentialList抽象類 有兩個抽象的 List 實現類:AbstractList 和 AbstractSequentialList。像 AbstractSet 類一樣,它們覆蓋了 equals() 和 hashCode() 方法以確保兩個相等的集合返回相同的雜湊碼。若兩個列表大小相等且包含順序相同的相同元素,則這兩個列表相等。這裡的 hashCode() 實現在 List 介面定義中指定,而在這裡實現。 除了equals()和hashCode(),AbstractList和AbstractSequentialList實現了其餘 List 方法的一部分。因為資料的隨機訪問和順序訪問是分別實現的,使得具體列表實現的建立更為容易。需要定義的一套方法取決於您希望支援的行為。您永遠不必親自提供的是 iterator方法的實現。 2.3. LinkedList類和ArrayList類 在“集合框架”中有兩種常規的 List 實現:ArrayList 和 LinkedList。使用兩種 List 實現的哪一種取決於您特定的需要。如果要支援隨機訪問,而不必在除尾部的任何位置插入或除去元素,那麼,ArrayList 提供了可選的集合。但如果,您要頻繁的從列表的中間位置新增和除去元素,而只要順序的訪問列表元素,那麼,LinkedList 實現更好。 “ArrayList 和 LinkedList 都實現 Cloneable 介面,都提供了兩個建構函式,一個無參的,一個接受另一個Collection” 2.3.1. LinkedList類 LinkedList類添加了一些處理列表兩端元素的方法。 (1) void addFirst(Object o): 將物件o新增到列表的開頭 void addLast(Object o):將物件o新增到列表的結尾 (2) Object getFirst(): 返回列表開頭的元素 Object getLast(): 返回列表結尾的元素 (3) Object removeFirst(): 刪除並且返回列表開頭的元素 Object removeLast():刪除並且返回列表結尾的元素 (4) LinkedList(): 構建一個空的連結列表 LinkedList(Collection c): 構建一個連結列表,並且新增集合c的所有元素 “使用這些新方法,您就可以輕鬆的把 LinkedList 當作一個堆疊、佇列或其它面向端點的資料結構。” 2.3.2. ArrayList類 ArrayList類封裝了一個動態再分配的Object[]陣列。每個ArrayList物件有一個capacity。這個capacity表示儲存列表中元素的陣列的容量。當元素新增到ArrayList時,它的capacity在常量時間內自動增加。 在向一個ArrayList物件新增大量元素的程式中,可使用ensureCapacity方法增加capacity。這可以減少增加重分配的數量。 (1) void ensureCapacity(int minCapacity): 將ArrayList物件容量增加minCapacity (2) void trimToSize(): 整理ArrayList物件容量為列表當前大小。程式可使用這個操作減少ArrayList物件儲存空間。 2.3.2.1. RandomAccess介面 一個特徵介面。該介面沒有任何方法,不過你可以使用該介面來測試某個集合是否支援有效的隨機訪問。ArrayList和Vector類用於實現該介面。
List 介面繼承了 Collection 介面以定義一個允許重複項的有序集合。該介面不但能夠對列表的一部分進行處理,還添加了面向位置的操作。 (1) 面向位置的操作包括插入某個元素或 Collection 的功能,還包括獲取、除去或更改元素的功能。在 List 中搜索元素可以從列表的頭部或尾部開始,如果找到元素,還將報告元素所在的位置 : void add(int index, Object element): 在指定位置index上新增元素element boolean addAll(int index, Collection c): 將集合c的所有元素新增到指定位置index Object get(int index): 返回List中指定位置的元素 int indexOf(Object o): 返回第一個出現元素o的位置,否則返回-1 int lastIndexOf(Object o) :返回最後一個出現元素o的位置,否則返回-1 Object remove(int index) :刪除指定位置上的元素 Object set(int index, Object element) :用元素element取代位置index上的元素,並且返回舊的元素 (2) List 介面不但以位置序列迭代的遍歷整個列表,還能處理集合的子集: ListIterator listIterator() : 返回一個列表迭代器,用來訪問列表中的元素 ListIterator listIterator(int index) : 返回一個列表迭代器,用來從指定位置index開始訪問列表中的元素 List subList(int fromIndex, int toIndex) :返回從指定位置fromIndex(包含)到toIndex(不包含)範圍中各個元素的列表檢視 “對子列表的更改(如 add()、remove() 和 set() 呼叫)對底層 List 也有影響。” 2.1.ListIterator介面 ListIterator 介面繼承 Iterator 介面以支援新增或更改底層集合中的元素,還支援雙向訪問。ListIterator沒有當前位置,游標位於呼叫previous和next方法返回的值之間。一個長度為n的列表,有n+1個有效索引值: (1) void add(Object o): 將物件o新增到當前位置的前面 void set(Object o): 用物件o替代next或previous方法訪問的上一個元素。如果上次呼叫後列表結構被修改了,那麼將丟擲IllegalStateException異常。 (2) boolean hasPrevious(): 判斷向後迭代時是否有元素可訪問 Object previous():返回上一個物件 int nextIndex(): 返回下次呼叫next方法時將返回的元素的索引 int previousIndex(): 返回下次呼叫previous方法時將返回的元素的索引 “正常情況下,不用ListIterator改變某次遍歷集合元素的方向 — 向前或者向後。雖然在技術上可以實現,但previous() 後立刻呼叫next(),返回的是同一個元素。把呼叫 next()和previous()的順序顛倒一下,結果相同。” “我們還需要稍微再解釋一下 add() 操作。新增一個元素會導致新元素立刻被新增到隱式游標的前面。因此,新增元素後呼叫 previous() 會返回新元素,而呼叫 next() 則不起作用,返回新增操作之前的下一個元素。” 2.2.AbstractList和AbstractSequentialList抽象類 有兩個抽象的 List 實現類:AbstractList 和 AbstractSequentialList。像 AbstractSet 類一樣,它們覆蓋了 equals() 和 hashCode() 方法以確保兩個相等的集合返回相同的雜湊碼。若兩個列表大小相等且包含順序相同的相同元素,則這兩個列表相等。這裡的 hashCode() 實現在 List 介面定義中指定,而在這裡實現。 除了equals()和hashCode(),AbstractList和AbstractSequentialList實現了其餘 List 方法的一部分。因為資料的隨機訪問和順序訪問是分別實現的,使得具體列表實現的建立更為容易。需要定義的一套方法取決於您希望支援的行為。您永遠不必親自提供的是 iterator方法的實現。 2.3. LinkedList類和ArrayList類 在“集合框架”中有兩種常規的 List 實現:ArrayList 和 LinkedList。使用兩種 List 實現的哪一種取決於您特定的需要。如果要支援隨機訪問,而不必在除尾部的任何位置插入或除去元素,那麼,ArrayList 提供了可選的集合。但如果,您要頻繁的從列表的中間位置新增和除去元素,而只要順序的訪問列表元素,那麼,LinkedList 實現更好。 “ArrayList 和 LinkedList 都實現 Cloneable 介面,都提供了兩個建構函式,一個無參的,一個接受另一個Collection” 2.3.1. LinkedList類 LinkedList類添加了一些處理列表兩端元素的方法。 (1) void addFirst(Object o): 將物件o新增到列表的開頭 void addLast(Object o):將物件o新增到列表的結尾 (2) Object getFirst(): 返回列表開頭的元素 Object getLast(): 返回列表結尾的元素 (3) Object removeFirst(): 刪除並且返回列表開頭的元素 Object removeLast():刪除並且返回列表結尾的元素 (4) LinkedList(): 構建一個空的連結列表 LinkedList(Collection c): 構建一個連結列表,並且新增集合c的所有元素 “使用這些新方法,您就可以輕鬆的把 LinkedList 當作一個堆疊、佇列或其它面向端點的資料結構。” 2.3.2. ArrayList類 ArrayList類封裝了一個動態再分配的Object[]陣列。每個ArrayList物件有一個capacity。這個capacity表示儲存列表中元素的陣列的容量。當元素新增到ArrayList時,它的capacity在常量時間內自動增加。 在向一個ArrayList物件新增大量元素的程式中,可使用ensureCapacity方法增加capacity。這可以減少增加重分配的數量。 (1) void ensureCapacity(int minCapacity): 將ArrayList物件容量增加minCapacity (2) void trimToSize(): 整理ArrayList物件容量為列表當前大小。程式可使用這個操作減少ArrayList物件儲存空間。 2.3.2.1. RandomAccess介面 一個特徵介面。該介面沒有任何方法,不過你可以使用該介面來測試某個集合是否支援有效的隨機訪問。ArrayList和Vector類用於實現該介面。