Collection類的層次結構圖(來源與網路)如下所示: Collection層次結構中的根介面。Collection 表示一組對象,這些對象也稱為 collection 的元素。一些 collection 允許有重覆的元素(如List,Queue),而另一些則不允許(如Set)。一些 colle ...
Collection類的層次結構圖(來源與網路)如下所示:
介面:Iterator<T>
public interface Iterable<T>
Iterable<T>介面作為超級介面,此介面中只有一個返回類型為Iterable<t> 的iterator()方法,實現這個介面允許對象成為 "foreach" 語句的目標。
介面:Collection<T>
public interface Collection<E> extends Iterable<E>
Collection層次結構中的根介面。Collection 表示一組對象,這些對象也稱為 collection 的元素。一些 collection 允許有重覆的元素(如List,Queue),而另一些則不允許(如Set)。一些 collection 是有序的(如List,TreeSet,LinkedHashSet,TreeMap,LinkedHashMap),而另一些則是無序的(如HashSet,HashMap)。JDK 不提供此介面的任何直接實現:它提供更具體的子介面(如 Set 和 List)實現。此介面通常用來傳遞 collection,併在需要最大普遍性的地方操作這些 collection。
介面:List<T>
public interface List<E> extends Collection<E>
有序的 collection(也稱為序列)。List介面在Collection介面的基礎上添加了大量的方法,使得可以對列表中每個元素的插入或移除位置進行精確地控制。用戶可以根據元素的整數索引(在列表中的位置)訪問元素,並搜索列表中的元素。
List介面在 iterator、add、remove、equals 和 hashCode 方法的協定上加了一些其他約定,超過了 Collection 介面中指定的約定。
List 介面提供了對列表元素進行定位(索引)訪問方法。列表(像 Java 數組一樣)是基於 0 的。註意,這些操作可能在和某些實現(例如 LinkedList 類)的索引值成比例的時間內執行。因此,如果不知道具體實現,那麼在列表元素上迭代(Iterator,或者foreach迴圈)通常優於用索引遍歷(for迴圈)列表。
List 介面提供了特殊的迭代器,稱為 ListIterator,除了允許 Iterator 介面提供的正常操作外,該迭代器還允許元素插入和替換,以及雙向訪問。還提供了一個方法來獲取從列表中指定位置開始的列表迭代器。
抽象類:AbastractCollection<T>
public abstract class AbstractCollection<E> extends Object implements Collection<E>
此類提供 Collection 介面的骨幹實現,實現了Collection介面的List、Set、Queue介面的實現類都可以繼承此抽象類,以最大限度地減少了實現此介面所需的工作。
該介面實現了除size,iterator之外的其他Collection中的介面,並對add方法進行了限制。
要實現一個不可修改的 collection,編程人員只需擴展此類,並提供 iterator 和 size 方法的實現。(iterator 方法返回的迭代器必須實現 hasNext 和 next。)
要實現可修改的 collection,編程人員在擴展此類並提供iterator和size方法的實現外,還必須另外重寫此類的 add 方法(否則,會拋出 UnsupportedOperationException),iterator 方法返回的迭代器還必須另外實現其 remove 方法。
抽象類:AbastractList<T>
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>
此類提供 List
介面的骨幹實現,以最大限度地減少實現“隨機訪問”數據存儲(如數組ArrayList)支持的該介面所需的工作(也就是實現了List介面擴展自Collection介面外的方法)。對於實現Collection介面中的方法,此類則是通過繼承AbstractCollection抽象類來實現。此類沒有實現的方法包括get(int index)和size(),並對set(int index, E element),add(int index,E element),remove(int index),add(E element)方法進行了限制。
對於連續的訪問數據(如鏈表LinkedList),應優先使用 AbstractSequentialList
,而不是此類。
要實現不可修改的列表,編程人員只需擴展此類,並提供 get(int)
和 size()
方法的實現。
要實現可修改的列表,編程人員必須另外重寫 set(int, E)
方法(否則將拋出 UnsupportedOperationException
)。如果列表為可變大小,則編程人員必須另外重寫 add(int, E)
和 remove(int)
方法。
類:ArrayList<T>
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable
ArrayList是List介面的大小可變的基於數組的實現。其底層採用數組的實現方式,所以具有良好的隨機訪問能力,但是對於在指定位置進行插入、刪除等操作的效率不高。
每個 ArrayList 實例都有一個容量。該容量是指用來存儲列表元素的數組的大小,沒有指定ArrayList容量大小時,創建的實例預設容量為10。隨著向 ArrayList 中不斷添加元素,其容量也自動增長。
此類的 iterator 和 listIterator 方法返回的迭代器是快速失敗的:在創建迭代器之後,除非通過迭代器自身的 remove 或 add 方法從結構上對列表進行修改,否則在任何時間以任何方式對列表進行修改,迭代器都會拋出 ConcurrentModificationException
。因此,面對併發的修改,迭代器很快就會完全失敗,而不是冒著在將來某個不確定時間發生任意不確定行為的風險。