本篇是以Java 8來說明。
其實從字面上即可看出區別。
Iterable
中文為可迭代的,而集合必須是可迭代的,所以集合都要繼承Iterable
介面;
Iterator
中文為迭代器,就是迭代用的工具。那誰需要用迭代器呢,就是裝有很多元素的集合。
所以集合是可迭代的Iterable
,並可使用迭代器Iterator
來迭代。
從Iterable
的API設計可看出以上特色,節錄原始碼如下。
java.lang.Iterable
public interface Iterable<T> {
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
}
從原始碼可以看到只要繼承Iterable
介面都必須實作iterator()
方法來取得Iterator
,意味著集合都要附帶一個迭代器。而使用For-Each loop語法迭代的集合必須實作Iterable
,且For-Each loop實際上是利用iterator()
取得該集合的Iterator
來迭代。
Iterable
與Iterator
的關係類似手機與充電線的關係。例如你買了台iPhone,總是會隨附iPhone的充電線讓你沒電時可以去充iPhone的電,雖然沒附也可以自己去買,但就是比較麻煩。除了手機,像是隨身硬碟與傳輸線,筆與筆芯的關係都很類似。
因此兩者的區別為:
Iterable
代表能被迭代的集合,所以能被For-Each loop及有forEach()
方法;
Iterator
代表集合的迭代器,所以有hasNext()
及next()
用來迭代的方法。
沒有留言:
張貼留言