首頁  >  文章  >  类库下载  >  JAVA程式設計想法---11.5 List,11.6迭代器

JAVA程式設計想法---11.5 List,11.6迭代器

高洛峰
高洛峰原創
2016-10-17 09:12:521507瀏覽

Collection類別的層次結構圖(來源與網路)如下圖所示:

JAVA程式設計想法---11.5 List,11.6迭代器

介面:Iterator

public interface Iterable<T>

Iterableator作為超級介面,此介面中只有一個介面中只有一個位元的類型傳回方法,實現這個介面允許物件成為"foreach" 語句的目標。

介面:Collection

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

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

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

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

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable

ArrayList是List介面的大小可變的基於陣列的實作。其底層採用數組的實現方式,所以具有良好的隨機存取能力,但是對於在指定位置進行插入、刪除等操作的效率不高。

每個 ArrayList 實例都有一個容量。此容量是指用來儲存清單元素的陣列的大小,沒有指定ArrayList容量大小時,建立的實例預設容量為10。隨著向 ArrayList 中不斷添加元素,其容量也自動增長。

此類的 iterator 和 listIterator 方法傳回的迭代器是快速失敗的:在建立迭代器之後,除非透過迭代器本身的 remove 或 add 方法從結構上對清單進行修改,否則在任何時間以任何方式對清單進行修改,迭代器都會拋出 ConcurrentModificationException。因此,面對並發的修改,迭代器很快就會完全失敗,而不是冒著在將來某個不確定時間發生任意不確定行為的風險。


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn