- iterator的簡要介紹
- Collection的簡要介紹
- 基本特性
- 方法
關於容器
java中有許多有用的容器,比如說Set,廣泛使用的ArrayList,這些容器使用的非常廣泛
所有這些容器都是直接或間接源於一個接口:Collection
(不是Collections)iterator與collection:容器的起源
容器是java的一個非常重要的組成部分,幾乎處處都會用到。
iterator的簡要介紹
java當中有兩個與容器迭代有關的接口,iterable與iterator,這兩個接口實現了容器中的迭代功能。從《java編程思想》p459中的容器繼承關系圖中可以看出:

Iterator是所有容器的基礎。
可以這樣來考慮:java中的容器,包括set,list,map等等,其最基本的屬性就是可迭代,先實現了迭代的接口,然后才根據各自的功能進行補全。iterable
iterable顧名思義,就是表示實現了這個接口的類都是可迭代的,iterable的主要用處就是提供
類型的iterator,以及使任何實現了這個接口的類都能夠使用forEach語句進行迭代
iterable的官方文檔如下:
https://docs.oracle.com/javase/9/docs/api/java/lang/Iterable.htmliterator
iterator就是容器的迭代器,容器對我們封裝了內部實現,作為補償,每種容器都可以通過其內部的迭代器進行迭代。
iterator的官方文檔如下:
https://docs.oracle.com/javase/9/docs/api/java/util/Iterator.htmliterator接口中提供了四個方法,分別是:
default void forEachRemaining(consumer<? super E> action);
(我也不知道這個方法的具體含義)
以及
Boolean hasNext(); E next(); default void remove();
這三個方法就是我們常用來對容器進行迭代的了。
其中hasNext() 就是判斷是否還有剩余元素沒有被迭代訪問,而next()方法就是返回當前的迭代器所指向的位置的接下來一個元素的引用。
第三個方法remove()需要注意
這個方法是將next()所指向的元素移除,對每一個next()指向,只能調用一次這個方法關於remove方法
如果一個正在迭代中的collection通過除remove方法之外的途徑被修改了,那么一個iterator的行為是未定義的,可能會產生許多匪夷所思的結果。除非子類覆蓋了這個方法並給出了確定的行為。
同樣的,如果在使用了forEachRemaining方法之后調用remove方法,其結果也是未定義的Collection的簡要介紹
源代碼中對collection的定義是這樣的:
public interface Collection<E> extends Iterable<E>
iterator是容器的最基本最抽象的性質——可迭代
而collection則對其稍微具體地完善了一下:collection代表了一組可迭代的對象
在collection接口沒有給出其它具體的要求,所以一個collection可以有各種不同的實現方式,比如說set與list就是兩種不同的實現,能夠分別滿足不同的功能要求。
collection的官方文檔如下:
https://docs.oracle.com/javase/9/docs/api/java/util/Collection.html基本特性
- 所有對collection的實現都必須至少包含兩種構造方法:一種不包含參數,直接創建一個空的對象。而另一種則含有一個collection類型的參數,該構造方法創建一個對象,並將參數的collection內的對象全都拷貝進來。對於這一點,沒有任何強制性的限定,如果要親自寫一個新的collection的話,要不要實現這兩種構造器全看程序員的心情
- collection中包含可選操作,具體描述可以參考《java編程思想》-17.4-可選操作,簡要來說,就是在對collection的implements中,可以不用實現所有的方法,比如說remove,是可以不要的,如果不嫌麻煩的話
- collection的implement有時候會對其內部的元素進行限定,比如說不能為null,或者不能含有重復元素
方法
雖然java沒有對collection接口的具體形式作出任何限制,但是通過接口里面的一大堆方法,可以知道一個collection所至少需要具備的功能:
(只列舉了一部分)- int size() 返回collection中的元素個數
- boolean isEmpty() 是否為空
- boolean contains(Object o) 是否包含o對象
- boolean containsAll(Collection<?> c) 是否包含c collection中的所有對象
- Iterator
iterator() 返回為該collection量身定制的迭代器 - Object[] toArray() 將collection轉化為一個對象的數組
- boolean add(E e) 添加一個e元素
- boolean addAll(Collection<? Extends E> c) 添加一堆元素
- boolean remove(Object o) 刪除一個o對象
- boolean removeAll(Collection<?> c) 刪除一堆元素
- void clear() 清空,讓我們從頭開始
- boolean equals(Object o) 關於等價的判斷
- int hashCode() 返回哈希值