歡迎關注公衆號:Coder編程 獲取最新原創技術文章和相關免費學習資料,隨時隨地學習技術知識!git
在上一篇文章經過面試題,讓咱們來了解Collection,咱們會發現Collection接口之上還有一個接口Iterable, Iterable接口裏面又有Iterator接口,那他們到底有什麼區別呢?咱們接下來就來了解下Iterable與Iterator相關內容,也就是本章的主要內容了,說不定 在咱們面試過程當中,也會遇到一些問題呢。那咱們就開始吧~github
涉及面試題:面試
上面的面試題能夠看出,其實都是一回事,只是換了一種提問方式,只要咱們能掌握核心要點,隨便面試官怎麼提問,咱們都能輕鬆應對!編程
來源百度百科:設計模式
Iterable: 百度的時候,我卻只看到了百度翻譯:可迭代的; 可重複的; 迭代的; 所以咱們能夠知道,實現了這個接口的集合對象支持迭代,是可迭代的。bash
Iterator: Iterator咱們通常叫迭代器,它就是提供迭代機制的對象,具體如何迭代,都是Iterator接口規範的。經過UML圖,咱們也能夠看出Iterable接口是Java集合框架的頂級接口, 實現此接口使集合對象能夠經過迭代器遍歷自身元素。同時在Java設計模式中也有一種模式——迭代器模式.(在後續的文章咱們會介紹相關設計模式,敬請關注~) 能夠看出Iterator是迭代器模式最好的一個應用例子!數據結構
由源碼圖能夠看出,Iterable有三個方法,分別是框架
接下來咱們簡單介紹下這裏面的方法。學習
Iterator<T> iterator();
複製代碼
該接口主要是返回T類型的元素上的一個迭代器。下面再詳細介紹Iterator。ui
default void forEach(Consumer<? super T> action) {
// 驗證action是否爲null,若是action爲null,則拋出NullPointerException
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
複製代碼
該方法是循環輸出,對內部元素進行遍歷,並對元素進行指定的操做。例如:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
numbers.forEach(integer -> System.out.println(integer));
複製代碼
對源碼註釋翻譯: 對這個Iterable的每個元素執行給定的動做指導全部元素都被處理或者動做拋出一個異常 爲止。除非被實現類指定,動做將以迭代的順序執行(若是一個迭代的順序被指定。)被動做 拋出的異常將被傳遞給調用者
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
複製代碼
該方法提供了一個能夠並行遍歷元素的迭代器,以適應如今cpu多核時代並行遍歷的需求。簡單說:分割,增長並行處理能力 對源碼註釋翻譯: 建立一個被這個Iterable接口描述的元素上Spliterator。默認實現從iterable的Iterator中建立一個早期綁定的spliterator。這個spliterator 繼承iterable的iterator的fail-fast性質。 默認實現應該老是被重寫。被默認實現返回的spliterator擁有很差分解能力,是不依據指定 大小定製的,並且不報告任何spliterator的性質。實現類差很少老是能提供更好的實現。
Iterator被稱之爲順序遍歷迭代器,jdk中默認對集合框架中數據結構作了實現。 Iterator在實際應用中有一個比較好的點就是,能夠一邊遍歷一遍刪除元素。後面我會經過ArrayList中的Iterator()方法進行說明。
由源碼圖Iterator接口中定義了四個方法,分別是
在JDK1.8以後Iterator中增長的一個默認方法
//使用方法
List<String> arr=new ArrayList<>();
arr.add("hello");
arr.add(("world"));
arr.iterator().forEachRemaining(str-> System.out.println(str));
複製代碼
forEachRemaining()源碼:
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
複製代碼
forEach()源碼:
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
複製代碼
經過源碼,咱們能夠看出他們之間的區別與聯繫。 相同點:
區別:
List list = new ArrayList();
list.add("公衆號");
list.add("Coder編程");
for (Iterator iter = list.iterator(); iter.hasNext();) {
String str = (String)iter.next();
System.out.println(str);
}
/*迭代器用於while循環
Iterator iter = list.iterator();
while(iter.hasNext()){
String str = (String) iter.next();
System.out.println(str);
}
*/
複製代碼
本章節主要介紹了Iterable與Iterator之間的區別與聯繫,以及其餘方面的小知識點,也是面試過程當中會出現的內容點。 歡迎關注公衆號:Coder編程 獲取最新原創技術文章和相關免費學習資料,隨時隨地學習技術知識!
歡迎你們關注並Star~