摘要:接口中的方法該接口主要是返回類型的元素上的一個迭代器。被動作拋出的異常將被傳遞給調用者接口中的方法該方法提供了一個可以并行遍歷元素的迭代器以適應現在多核時代并行遍歷的需求。
前言
歡迎關注公眾號:Coder編程
獲取最新原創技術文章和相關免費學習資料,隨時隨地學習技術知識!
在上一篇文章通過面試題,讓我們來了解Collection,我們會發現Collection接口之上還有一個接口Iterable,
Iterable接口里面又有Iterator接口,那他們到底有什么區別呢?我們接下來就來了解下Iterable與Iterator相關內容,也就是本章的主要內容了,說不定
在我們面試過程中,也會遇到一些問題呢。那我們就開始吧~
涉及面試題:
1.說一說Iterable?
2.Iterable結構?
3.說一說Iterator?
4.Iterator結構?
5.forEachRemaining()與forEach()方法的區別?
6.Iterator如何使用?
7.Iterable與Iterator之間的區別與聯系?
上面的面試題可以看出,其實都是一回事,只是換了一種提問方式,只要我們能掌握核心要點,隨便面試官怎么提問,我們都能輕松應對!
來源百度百科:
Iterable: 百度的時候,我卻只看到了百度翻譯:可迭代的; 可重復的; 迭代的; 因此我們可以知道,實現了這個接口的集合對象支持迭代,是可迭代的。
Iterator: Iterator我們一般叫迭代器,它就是提供迭代機制的對象,具體如何迭代,都是Iterator接口規范的。通過UML圖,我們也可以看出Iterable接口是Java集合框架的頂級接口,
實現此接口使集合對象可以通過迭代器遍歷自身元素。同時在Java設計模式中也有一種模式——迭代器模式.(在后續的文章我們會介紹相關設計模式,敬請關注~)
可以看出Iterator是迭代器模式最好的一個應用例子!
由源碼圖可以看出,Iterable有三個方法,分別是
Iterator
default void forEach(Consumer super T> action){}; JDK 1.8后新增
default Spliterator
接下來我們簡單介紹下這里面的方法。
1.1 Iterable接口中的iterator() 方法Iteratoriterator();
該接口主要是返回T類型的元素上的一個迭代器。下面再詳細介紹Iterator。
1.2 Iterable接口中的forEach() 方法default void forEach(Consumer super T> action) { // 驗證action是否為null,如果action為null,則拋出NullPointerException Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }
該方法是循環輸出,對內部元素進行遍歷,并對元素進行指定的操作。例如:
Listnumbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); numbers.forEach(integer -> System.out.println(integer));
對源碼注釋翻譯:
對這個Iterable的每一個元素執行給定的動作指導所有元素都被處理或者動作拋出一個異常
為止。除非被實現類指定,動作將以迭代的順序執行(如果一個迭代的順序被指定。)被動作
拋出的異常將被傳遞給調用者
default Spliteratorspliterator() { return Spliterators.spliteratorUnknownSize(iterator(), 0); }
該方法提供了一個可以并行遍歷元素的迭代器,以適應現在cpu多核時代并行遍歷的需求。簡單說:分割,增加并行處理能力
對源碼注釋翻譯:
創建一個被這個Iterable接口描述的元素上Spliterator。默認實現從iterable的Iterator中創建一個早期綁定的spliterator。這個spliterator
繼承iterable的iterator的fail-fast性質。
默認實現應該總是被重寫。被默認實現返回的spliterator擁有不好分解能力,是不依據指定
大小定制的,而且不報告任何spliterator的性質。實現類差不多總是能提供更好的實現。
Iterator被稱之為順序遍歷迭代器,jdk中默認對集合框架中數據結構做了實現。
Iterator在實際應用中有一個比較好的點就是,可以一邊遍歷一遍刪除元素。后面我會通過ArrayList中的Iterator()方法進行說明。
由源碼圖Iterator接口中定義了四個方法,分別是
boolean hasNext():如果被迭代遍歷的集合還沒有被遍歷完,返回True
Object next():返回集合里面的下一個元素
remove():刪除集合里面上一次next()方法返回的元素
void forEachRemaining(Consumer action):JDK 1.8后新增默認方法 使用Lambda表達式來遍歷集合元素
2.3 Iterator接口中的forEachRemaining() 方法在JDK1.8之后Iterator中增加的一個默認方法
//使用方法 List2.3.1 forEachRemaining()與forEach()方法之間的區別?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); } }
通過源碼,我們可以看出他們之間的區別與聯系。
相同點:
都可以遍歷集合
都是接口的默認方法
都是1.8版本引入的
區別:
forEachRemaining()方法內部是通過使用迭代器Iterator的所有元素,forEach()方法內部使用的是增強for循環。
forEach()方法可以多次調用,forEachRemaining()方法第二次調用不會做任何操作,因為不會有下一個元素。
3.Iterator如何使用? 簡單舉個小栗子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); } */推薦閱讀
帶你了解Collection相關知識!
一篇讓你理解進程與線程的區別與聯系!
文末本章節主要介紹了Iterable與Iterator之間的區別與聯系,以及其他方面的小知識點,也是面試過程中會出現的內容點。
歡迎關注公眾號:Coder編程
獲取最新原創技術文章和相關免費學習資料,隨時隨地學習技術知識!
Github個人主頁目錄
Gitee個人主頁目錄
歡迎大家關注并Star~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73930.html
摘要:性能統計有助于幫我們檢測網站的用戶體驗。這樣,我們就輕輕松松的統計到了首屏時間。下一章,我們將繼續聊聊百度移動版首頁那些事。 歡迎大家收看聊一聊系列,這一套系列文章,可以幫助前端工程師們了解前端的方方面面(不僅僅是代碼): https://segmentfault.com/blog/frontenddriver 上一篇文章我們討論了,如何進行前端日志打點統計: https://segm...
摘要:性能統計有助于幫我們檢測網站的用戶體驗。這樣,我們就輕輕松松的統計到了首屏時間。下一章,我們將繼續聊聊百度移動版首頁那些事。 歡迎大家收看聊一聊系列,這一套系列文章,可以幫助前端工程師們了解前端的方方面面(不僅僅是代碼): https://segmentfault.com/blog/frontenddriver 上一篇文章我們討論了,如何進行前端日志打點統計: https://segm...
摘要:會各種折行,樣式錯亂,那么細致如蘋果肯定不允許這種事情發生。又一次變遷蘋果公司在年,推出了新一代的,他們的屏幕都比要寬要大。 歡迎大家收看聊一聊系列,這一套系列文章,可以幫助前端工程師們了解前端的方方面面(不僅僅是代碼): https://segmentfault.com/blog/frontenddriver 不同于PC時代,移動web的樣式更加多樣,也由于手機分辨率的碎片化,移動w...
摘要:一個對象如果要有可被循環調用的接口,就必須在的屬性上部署遍歷器生成方法原型鏈上的對象具有該方法也可。阮大神案例上面代碼是一個類部署接口的寫法。屬性對應一個函數,執行后返回當前對象的遍歷器對象。 最近看阮一峰阮大神的ES6,剛剛看到Iterator和for...of循環這一章,小作筆記跟大家略微分享一下,不足之處還望大家多多指正 Iterator(遍歷器)就是一種機制;任何數據結構只要是...
閱讀 3189·2021-11-24 10:30
閱讀 1313·2021-09-30 09:56
閱讀 2385·2021-09-07 10:20
閱讀 2596·2021-08-27 13:10
閱讀 698·2019-08-30 11:11
閱讀 2050·2019-08-29 12:13
閱讀 758·2019-08-26 12:24
閱讀 2897·2019-08-26 12:20