[[集合] 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源碼解析
插播廣告:
未關注的貝貝可以來波關注啦。後續更多精彩内容等着您。

感謝關注
吾非大神,與汝俱進