Java中 Iterable 和 Iterator 的区别
1、Iterable接口
Iterable接口 (java.lang.Iterable) 是Java集合的頂級接口之一。我們首先看下這這個接口在JDK中的定義:
package java.lang; public interface Iterable<AnyType> { Iterator<AnyType> iterator(); }?
(1)可見,Iterable接口中只包含一個方法,就是一個iterator()方法,用來返回一個Iterator類型的對象,或者說返回一個實(shí)現(xiàn)了Iterator接口的對象。
(2)實(shí)現(xiàn)了Iterable接口的類可以擁有增強(qiáng)的for循環(huán),即只要實(shí)現(xiàn)了Iterable接口的類,就可以使用Iterator迭代器了。如
public static <AnyType> void print(Collection<AnyType> coll) {for(AnyType item: coll)System.out.println(item); }?
Tip:注意這里的函數(shù)輸入?yún)?shù)Collection<AnyType> coll,其中coll是個接口變量。本來接口是不能用new來實(shí)例化一個接口的,即不能構(gòu)造接口對象,但是可以用來聲明接口變量,而且接口變量必須引用實(shí)現(xiàn)了接口的類對象。
(3)集合Collection、List、Set都是Iterable的實(shí)現(xiàn)類,所以他們及其他們的子類都可以使用foreach進(jìn)行迭代。
2、Iterator接口
Iterator接口在JDK中的定義:
package java.util; public interface Iterator<AnyType> { boolean hasNext(); AnyType next(); void remove(); }?
(1)當(dāng)編譯器見到一個正在用于Iterable對象的增強(qiáng)的for循環(huán)的時候,它用對iterator()方法的調(diào)用來代替增強(qiáng)的for循環(huán)以得到一個Iterator對象,然后調(diào)用next和hasNext。我們可以給出iterator()方法的定義
因此,上面Iterable例程可以改寫為:
public static <AnyType> void print(Collection<AnyType> coll) {Iterator<AnyType> itr = coil.iterator();while(itr.hasNext()){AnyType item = itr.next();System.out.println(item);} }(2)Iterator接口中的核心方法next(),hasNext(),remove(),都是依賴當(dāng)前位置。如果這些集合直接實(shí)現(xiàn)Iterator接口,則勢必導(dǎo)致集合對象中包含當(dāng)前迭代位置的數(shù)據(jù)(指針)。當(dāng)集合在不同方法間進(jìn)行傳遞的時候,由于當(dāng)前迭代位置不可知,所以next()的結(jié)果也不可知。除非再為Iterator接口添加一個reset()方法,用來重置當(dāng)前迭代位置。 而當(dāng)實(shí)現(xiàn)Iterable則不然,每次調(diào)用都返回一個從頭開始的迭代器,各個迭代器之間互不影響。
3、綜合應(yīng)用
我們后面會自己實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)ArrayList,其中就用到了Iterable接口和Iterator接口,我們看下這個綜合的例子
// Obtains an Iterator object used to traverse the collectionpublic java.util.Iterator<AnyType> iterator(){return new ArrayListIterator();}/*** This is the implementation of the ArrayListIterator.* It maintains a notion of a current position and * the implicit reference to the MyArrayList.**/private class ArrayListIterator implements java.util.Iterator<AnyType>{private int current = 0;private boolean okToRemove = false;public boolean hasNest(){return current<size();}public AnyType next(){if(!hasNext())throw new java.util.NoSuchElementException();okToRemove = true;return theItems[current++];}public void remove(){if(!okToRemove)throw new IllegalStateException();MyArrayList.this.remove(--current);okToRemove = false;}}其中,iterator()方法就直接返回ArrayListIterator類的一個實(shí)例,該類是一個實(shí)現(xiàn)Iterator接口的類。
?
?
via: http://blog.csdn.net/lipengcn/article/details/51700153
?
轉(zhuǎn)載于:https://www.cnblogs.com/whlshot/p/8000619.html
總結(jié)
以上是生活随笔為你收集整理的Java中 Iterable 和 Iterator 的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python报错 TypeError:
- 下一篇: 第十七次ScrumMeeting会议