亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

聊一聊Iterable與Iterator的那些事!

honmaple / 2674人閱讀

摘要:接口中的方法該接口主要是返回類(lèi)型的元素上的一個(gè)迭代器。被動(dòng)作拋出的異常將被傳遞給調(diào)用者接口中的方法該方法提供了一個(gè)可以并行遍歷元素的迭代器以適應(yīng)現(xiàn)在多核時(shí)代并行遍歷的需求。

前言
歡迎關(guān)注公眾號(hào):Coder編程
獲取最新原創(chuàng)技術(shù)文章和相關(guān)免費(fèi)學(xué)習(xí)資料,隨時(shí)隨地學(xué)習(xí)技術(shù)知識(shí)!

在上一篇文章通過(guò)面試題,讓我們來(lái)了解Collection,我們會(huì)發(fā)現(xiàn)Collection接口之上還有一個(gè)接口Iterable,
Iterable接口里面又有Iterator接口,那他們到底有什么區(qū)別呢?我們接下來(lái)就來(lái)了解下Iterable與Iterator相關(guān)內(nèi)容,也就是本章的主要內(nèi)容了,說(shuō)不定
在我們面試過(guò)程中,也會(huì)遇到一些問(wèn)題呢。那我們就開(kāi)始吧~

涉及面試題:

1.說(shuō)一說(shuō)Iterable?

2.Iterable結(jié)構(gòu)?

3.說(shuō)一說(shuō)Iterator?

4.Iterator結(jié)構(gòu)?

5.forEachRemaining()與forEach()方法的區(qū)別?

6.Iterator如何使用?

7.Iterable與Iterator之間的區(qū)別與聯(lián)系?

上面的面試題可以看出,其實(shí)都是一回事,只是換了一種提問(wèn)方式,只要我們能掌握核心要點(diǎn),隨便面試官怎么提問(wèn),我們都能輕松應(yīng)對(duì)!
來(lái)源百度百科:

Iterable: 百度的時(shí)候,我卻只看到了百度翻譯:可迭代的; 可重復(fù)的; 迭代的; 因此我們可以知道,實(shí)現(xiàn)了這個(gè)接口的集合對(duì)象支持迭代,是可迭代的。

Iterator: Iterator我們一般叫迭代器,它就是提供迭代機(jī)制的對(duì)象,具體如何迭代,都是Iterator接口規(guī)范的。通過(guò)UML圖,我們也可以看出Iterable接口是Java集合框架的頂級(jí)接口,
實(shí)現(xiàn)此接口使集合對(duì)象可以通過(guò)迭代器遍歷自身元素。同時(shí)在Java設(shè)計(jì)模式中也有一種模式——迭代器模式.(在后續(xù)的文章我們會(huì)介紹相關(guān)設(shè)計(jì)模式,敬請(qǐng)關(guān)注~)
可以看出Iterator是迭代器模式最好的一個(gè)應(yīng)用例子!

1.說(shuō)一說(shuō)Iterable?

由源碼圖可以看出,Iterable有三個(gè)方法,分別是

Iterator iterator();

default void forEach(Consumer action){}; JDK 1.8后新增

default Spliterator spliterator(){}; JDK 1.8后新增

接下來(lái)我們簡(jiǎn)單介紹下這里面的方法。

1.1 Iterable接口中的iterator() 方法
Iterator iterator();

該接口主要是返回T類(lèi)型的元素上的一個(gè)迭代器。下面再詳細(xì)介紹Iterator。

1.2 Iterable接口中的forEach() 方法
default void forEach(Consumer action) {
        // 驗(yàn)證action是否為null,如果action為null,則拋出NullPointerException
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

該方法是循環(huán)輸出,對(duì)內(nèi)部元素進(jìn)行遍歷,并對(duì)元素進(jìn)行指定的操作。例如:

List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
 numbers.forEach(integer -> System.out.println(integer));

對(duì)源碼注釋翻譯:
對(duì)這個(gè)Iterable的每一個(gè)元素執(zhí)行給定的動(dòng)作指導(dǎo)所有元素都被處理或者動(dòng)作拋出一個(gè)異常
為止。除非被實(shí)現(xiàn)類(lèi)指定,動(dòng)作將以迭代的順序執(zhí)行(如果一個(gè)迭代的順序被指定。)被動(dòng)作
拋出的異常將被傳遞給調(diào)用者

1.3 Iterable接口中的spliterator() 方法
default Spliterator spliterator() {
    return Spliterators.spliteratorUnknownSize(iterator(), 0);
}

該方法提供了一個(gè)可以并行遍歷元素的迭代器,以適應(yīng)現(xiàn)在cpu多核時(shí)代并行遍歷的需求。簡(jiǎn)單說(shuō):分割,增加并行處理能力
對(duì)源碼注釋翻譯:
創(chuàng)建一個(gè)被這個(gè)Iterable接口描述的元素上Spliterator。默認(rèn)實(shí)現(xiàn)從iterable的Iterator中創(chuàng)建一個(gè)早期綁定的spliterator。這個(gè)spliterator
繼承iterable的iterator的fail-fast性質(zhì)。
默認(rèn)實(shí)現(xiàn)應(yīng)該總是被重寫(xiě)。被默認(rèn)實(shí)現(xiàn)返回的spliterator擁有不好分解能力,是不依據(jù)指定
大小定制的,而且不報(bào)告任何spliterator的性質(zhì)。實(shí)現(xiàn)類(lèi)差不多總是能提供更好的實(shí)現(xiàn)。

2.說(shuō)一說(shuō)Iterator? 2.1 Iterator是什么?

Iterator被稱(chēng)之為順序遍歷迭代器,jdk中默認(rèn)對(duì)集合框架中數(shù)據(jù)結(jié)構(gòu)做了實(shí)現(xiàn)。
Iterator在實(shí)際應(yīng)用中有一個(gè)比較好的點(diǎn)就是,可以一邊遍歷一遍刪除元素。后面我會(huì)通過(guò)ArrayList中的Iterator()方法進(jìn)行說(shuō)明。

2.2 Iterator結(jié)構(gòu)?

由源碼圖Iterator接口中定義了四個(gè)方法,分別是

boolean hasNext():如果被迭代遍歷的集合還沒(méi)有被遍歷完,返回True

Object next():返回集合里面的下一個(gè)元素

remove():刪除集合里面上一次next()方法返回的元素

void forEachRemaining(Consumer action):JDK 1.8后新增默認(rèn)方法 使用Lambda表達(dá)式來(lái)遍歷集合元素

2.3 Iterator接口中的forEachRemaining() 方法

在JDK1.8之后Iterator中增加的一個(gè)默認(rèn)方法

//使用方法
List arr=new ArrayList<>();
arr.add("hello");
arr.add(("world"));
arr.iterator().forEachRemaining(str-> System.out.println(str));
2.3.1 forEachRemaining()與forEach()方法之間的區(qū)別?

forEachRemaining()源碼:

default void forEachRemaining(Consumer action) {
    Objects.requireNonNull(action);
    while (hasNext())
        action.accept(next());
}

forEach()源碼:

default void forEach(Consumer action) {
    Objects.requireNonNull(action);
    for (T t : this) {
        action.accept(t);
    }
}

通過(guò)源碼,我們可以看出他們之間的區(qū)別與聯(lián)系。
相同點(diǎn):

都可以遍歷集合

都是接口的默認(rèn)方法

都是1.8版本引入的

區(qū)別:

forEachRemaining()方法內(nèi)部是通過(guò)使用迭代器Iterator的所有元素,forEach()方法內(nèi)部使用的是增強(qiáng)for循環(huán)。

forEach()方法可以多次調(diào)用,forEachRemaining()方法第二次調(diào)用不會(huì)做任何操作,因?yàn)椴粫?huì)有下一個(gè)元素。

3.Iterator如何使用? 簡(jiǎn)單舉個(gè)小栗子
List list = new ArrayList();
list.add("公眾號(hào)");
list.add("Coder編程");
for (Iterator iter = list.iterator(); iter.hasNext();) {
String str = (String)iter.next();
System.out.println(str);
}
/*迭代器用于while循環(huán)
Iterator iter = list.iterator();
while(iter.hasNext()){
String str = (String) iter.next();
System.out.println(str);
}
*/
推薦閱讀

帶你了解Collection相關(guān)知識(shí)!

一篇讓你理解進(jìn)程與線程的區(qū)別與聯(lián)系!

文末
本章節(jié)主要介紹了Iterable與Iterator之間的區(qū)別與聯(lián)系,以及其他方面的小知識(shí)點(diǎn),也是面試過(guò)程中會(huì)出現(xiàn)的內(nèi)容點(diǎn)。
歡迎關(guān)注公眾號(hào):Coder編程
獲取最新原創(chuàng)技術(shù)文章和相關(guān)免費(fèi)學(xué)習(xí)資料,隨時(shí)隨地學(xué)習(xí)技術(shù)知識(shí)!

Github個(gè)人主頁(yè)目錄

Gitee個(gè)人主頁(yè)目錄

歡迎大家關(guān)注并Star~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/73930.html

相關(guān)文章

  • [一聊系列]一聊前端速度統(tǒng)計(jì)(性能統(tǒng)計(jì))那些

    摘要:性能統(tǒng)計(jì)有助于幫我們檢測(cè)網(wǎng)站的用戶體驗(yàn)。這樣,我們就輕輕松松的統(tǒng)計(jì)到了首屏?xí)r間。下一章,我們將繼續(xù)聊聊百度移動(dòng)版首頁(yè)那些事。 歡迎大家收看聊一聊系列,這一套系列文章,可以幫助前端工程師們了解前端的方方面面(不僅僅是代碼): https://segmentfault.com/blog/frontenddriver 上一篇文章我們討論了,如何進(jìn)行前端日志打點(diǎn)統(tǒng)計(jì): https://segm...

    gclove 評(píng)論0 收藏0
  • [一聊系列]一聊前端速度統(tǒng)計(jì)(性能統(tǒng)計(jì))那些

    摘要:性能統(tǒng)計(jì)有助于幫我們檢測(cè)網(wǎng)站的用戶體驗(yàn)。這樣,我們就輕輕松松的統(tǒng)計(jì)到了首屏?xí)r間。下一章,我們將繼續(xù)聊聊百度移動(dòng)版首頁(yè)那些事。 歡迎大家收看聊一聊系列,這一套系列文章,可以幫助前端工程師們了解前端的方方面面(不僅僅是代碼): https://segmentfault.com/blog/frontenddriver 上一篇文章我們討論了,如何進(jìn)行前端日志打點(diǎn)統(tǒng)計(jì): https://segm...

    Karuru 評(píng)論0 收藏0
  • [一聊系列]一聊移動(dòng)web分辨率那些

    摘要:會(huì)各種折行,樣式錯(cuò)亂,那么細(xì)致如蘋(píng)果肯定不允許這種事情發(fā)生。又一次變遷蘋(píng)果公司在年,推出了新一代的,他們的屏幕都比要寬要大。 歡迎大家收看聊一聊系列,這一套系列文章,可以幫助前端工程師們了解前端的方方面面(不僅僅是代碼): https://segmentfault.com/blog/frontenddriver 不同于PC時(shí)代,移動(dòng)web的樣式更加多樣,也由于手機(jī)分辨率的碎片化,移動(dòng)w...

    vibiu 評(píng)論0 收藏0
  • ES6中Iterator和for...of循環(huán)那些

    摘要:一個(gè)對(duì)象如果要有可被循環(huán)調(diào)用的接口,就必須在的屬性上部署遍歷器生成方法原型鏈上的對(duì)象具有該方法也可。阮大神案例上面代碼是一個(gè)類(lèi)部署接口的寫(xiě)法。屬性對(duì)應(yīng)一個(gè)函數(shù),執(zhí)行后返回當(dāng)前對(duì)象的遍歷器對(duì)象。 最近看阮一峰阮大神的ES6,剛剛看到Iterator和for...of循環(huán)這一章,小作筆記跟大家略微分享一下,不足之處還望大家多多指正 Iterator(遍歷器)就是一種機(jī)制;任何數(shù)據(jù)結(jié)構(gòu)只要是...

    OpenDigg 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<