Java中的Iterator和Iterable 區(qū)別

二者路徑分別如下:
java.lang.Iterable
java.util.Iterator

Iterator是迭代器類,而Iterable是接口。
好多類都實(shí)現(xiàn)了Iterable接口,這樣對(duì)象就可以調(diào)用iterator()方法。
一般都是結(jié)合著用,比如
HashMap類就實(shí)現(xiàn)了Iterable接口,而要訪問(wèn)或打印出Map中所有內(nèi)容時(shí),就可以這樣: HashMap hashMap;
Iterator iter = hashMap.iterator();
while(iter.hashNext()) {
String s = iter.next();
}

為什么一定要實(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è)從頭開始計(jì)數(shù)的迭代器。多個(gè)迭代器是互不干擾的。

最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • PYTHON-進(jìn)階-ITERTOOLS模塊小結(jié)轉(zhuǎn)自wklken:http://wklken.me/posts/20...
    C_Y_閱讀 1,167評(píng)論 0 2
  • Collection接口 Collection接口是所有集合的祖先類。他有兩個(gè)構(gòu)造方法,一個(gè)無(wú)參構(gòu)造,一個(gè)是帶Co...
    夜幕繁華閱讀 682評(píng)論 0 0
  • 接口/抽象類意義規(guī)范、擴(kuò)展、回調(diào)為其子類提供一個(gè)公共的類型 封裝子類中得重復(fù)內(nèi)容 定義抽象方法,子類雖然有不同的實(shí)...
    MigrationUK閱讀 2,347評(píng)論 1 28
  • java筆記第一天 == 和 equals ==比較的比較的是兩個(gè)變量的值是否相等,對(duì)于引用型變量表示的是兩個(gè)變量...
    jmychou閱讀 1,645評(píng)論 0 3
  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX閱讀 959評(píng)論 0 1

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