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è)迭代器是互不干擾的。