網頁

2020/7/12

Java Iterable 與 Iterator 區別

Java的IterableIterator的差別如下。

本篇是以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來迭代。

IterableIterator的關係類似手機與充電線的關係。例如你買了台iPhone,總是會隨附iPhone的充電線讓你沒電時可以去充iPhone的電,雖然沒附也可以自己去買,但就是比較麻煩。除了手機,像是隨身硬碟與傳輸線,筆與筆芯的關係都很類似。


因此兩者的區別為:
Iterable代表能被迭代的集合,所以能被For-Each loop及有forEach()方法;
Iterator代表集合的迭代器,所以有hasNext()next()用來迭代的方法。


沒有留言:

張貼留言