Java Iterable、Iterator

Iterable

public interface Iterable<T>
{
    Iterator<T> iterator();
    ...
}

Iterable是可以迭代的一系列元素的表示。它沒(méi)有任何迭代狀態(tài),例如“當(dāng)前元素”。相反,它有一個(gè)生成迭代器的方法。

Iterator

public interface Iterator<E>
{
    boolean hasNext();
    E next();
    void remove();
    ...
}

迭代器是具有迭代狀態(tài)的對(duì)象。它允許你使用hasNext檢查它是否有更多元素,并使用next移動(dòng)到下一個(gè)元素(如果有)。

為什么一定要實(shí)現(xiàn)Iterable接口,為什么不直接實(shí)現(xiàn)Iterator接口呢?

看一下JDK中的集合類,比如List一族或者Set一族,都是實(shí)現(xiàn)了Iterable接口,但并不直接實(shí)現(xiàn)Iterator接口。仔細(xì)想一下這么做是有道理的:

因?yàn)镮terator接口的核心方法next()或者h(yuǎn)asNext()是依賴于迭代器的當(dāng)前迭代位置的。如果Collection直接實(shí)現(xiàn)Iterator接口,勢(shì)必導(dǎo)致集合對(duì)象中包含當(dāng)前迭代位置的數(shù)據(jù)(指針)。當(dāng)集合在不同方法間被傳遞時(shí),由于當(dāng)前迭代位置不可預(yù)置,那么next()方法的結(jié)果會(huì)變成不可預(yù)知。除非再為Iterator接口添加一個(gè)reset()方法,用來(lái)重置當(dāng)前迭代位置。但即時(shí)這樣,Collection也只能同時(shí)存在一個(gè)當(dāng)前迭代位置。而Iterable則不然,每次調(diào)用都會(huì)返回一個(gè)從頭開(kāi)始計(jì)數(shù)的迭代器。多個(gè)迭代器是互不干擾的。

參考資料

  1. What is the difference between iterator and iterable and how to use them?
  2. java中的Iterator和Iterable 區(qū)別
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • title: Java-Iterable&Iteratordate: 2018-04-08 10:24:57tag...
    Mr_Normal閱讀 438評(píng)論 2 0
  • 1 場(chǎng)景問(wèn)題# 1.1 工資表數(shù)據(jù)的整合## 考慮這樣一個(gè)實(shí)際應(yīng)用:整合工資表數(shù)據(jù)。 這個(gè)項(xiàng)目的背景是這樣的,項(xiàng)目...
    七寸知架構(gòu)閱讀 2,645評(píng)論 0 53
  • 四、集合框架 1:String類:字符串(重點(diǎn)) (1)多個(gè)字符組成的一個(gè)序列,叫字符串。生活中很多數(shù)據(jù)的描述都采...
    佘大將軍閱讀 874評(píng)論 0 2
  • 2018.2.18 我發(fā)現(xiàn)你刪了我,我不知道為什么 曾經(jīng)你告訴我,我們都是孤獨(dú)的人,而現(xiàn)在,我孤獨(dú)了,你在哪 昨天...
    麻子mazi閱讀 198評(píng)論 0 0
  • 斗柄移兌野,人間近中元。 夢(mèng)中會(huì)故人,墳前寄紙錢(qián)。
    秋風(fēng)勁勁閱讀 236評(píng)論 0 1

友情鏈接更多精彩內(nèi)容