天天看點

[集合] Itreator源碼解析(3)接口緣由接口介紹Iterator源碼Iterator源碼解析位址下集預告:

[[集合] Itreator源碼解析(3)] https://copyfuture.com/blogs-details/20191017160706614rpgeagffzztaeod 本篇文章不長,因為隻介紹Itreator接口,而不涉及它的實作。

接口緣由

由于每一個容器都有取出元素的功能。這些功能定義都一樣,隻不過實作的具體方式不同(因為每一個容器的資料結構不一樣)是以對共性的取出功能進行了抽取,進而出現了Iterator接口。而每一個容器都在其内部對該接口進行了内部類的實作。也就是将取出方式的細節進行封裝。

Itreator接口是Jdk1.5之後添加的新接口, Collection的父接口。 實作了Iterable的類就是可疊代的。并且支援增強for循環。

該接口隻有一個方法即擷取疊代器的方法iterator()可以擷取每個容器自身的疊代器Iterator。

(Collection)集合容器都需要擷取疊代器(Iterator)于是在5.0後又進行了抽取将擷取容器疊代器的iterator()方法放入到了Iterable接口中。

Collection接口繼承了Iterable,是以Collection體系都具備擷取自身疊代器的方法,隻不過每個子類集合都進行了重寫(因為資料結構不同)。

Iterable接口的源碼主要方法就是iterator()、forEach(Consumer<? super T> action)、spliterator()(并行周遊),Iterable接口就不做過多介紹了。後面有機會再看。

接口介紹

Itreator直譯過來就是疊代器,疊代可以簡單的了解為周遊,是一個标準化周遊各類容器裡面的所有對象的方法類,它是一個很典型的設計模式。

Iterator 模式是用于周遊集合類的标準通路方法。它可以把通路邏輯從不同類型的集合類中抽象出來,進而避免向用戶端暴露集合的内部結構。

Iterator是為了友善的處理集合中的元素,該接口提供了一些方法專門處理集合中的元素.例如删除和擷取集合中的元素.

該對象比較特殊,不能直接建立對象(通過new),該對象是以内部類的形式存在于每個集合類的内部。

在前面的Collection接口中,已經知道,通過iterator()方法便可以擷取集合類疊代器。是以所有的Collection體系集合都可以擷取自身的疊代器。

Iterator源碼

/**
 *
 * 關于該接口的實作,在集合的實作類中還會再講到,例如,ArrayList中的Itr
 *
 * @param <E> 此疊代器傳回的元素類型
 *
 * @author  Josh Bloch
 * @see Collection
 * @see ListIterator
 * @see Iterable
 * @since 1.2
 */
public interface Iterator<E> {
    /**
     * 判斷集合中是否有元素,如果有元素可以疊代,就傳回true。
     */
    boolean hasNext();

    /**
     * 傳回疊代的下一個元素,注意: 如果沒有下一個元素時,調用
     * next方法時,會抛出NoSuchElementException
     */
    E next();

    /**
     * 從疊代器指向的集合中移除疊代器傳回的最後一個元素(可選操作)。
     */
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

    /**
     * 為每個剩餘元素執行給定的操作,直到所有的元素都已經被處理或行動抛出一個異常。
     * Java Stream的處理在這裡不進行詳解,後續會有文章專門介紹
     *
     * @param action 要為每個元素執行的操作
     * @throws NullPointerException 如果指定的操作為null
     * @since 1.8之後加的方法  
     */
    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}           

簡單了解:通過Iterator疊代器接口可以通路集合中的每一個元素

其他的沒多少好說的了,大家花費3-5分鐘應該就可以結束了本篇的閱讀。

注意!疊代器中的遊标不是指向元素,而是元素之間的位置,是以才有了之前的元素和之後的元素之分!!!

Iterator源碼解析位址

https://github.com/chenhaoxiang/JDK1.8/blob/master/jdk-analyze/src/main/java/java/util/Iterator.java

小手點點,實時收獲源碼解析,感謝您的star

下集預告:

Iterable接口的源碼沒啥好說的,接下來就是List源碼解析

插播廣告:

未關注的貝貝可以來波關注啦。後續更多精彩内容等着您。

[集合] Itreator源碼解析(3)接口緣由接口介紹Iterator源碼Iterator源碼解析位址下集預告:

感謝關注

吾非大神,與汝俱進