私はJavaが初めてで、イテレータとイテラブルと本当に混同しています。誰かが私に説明して、いくつかの例を挙げてもらえますか?
14 に答える
anIterable
は、反復可能な一連の要素の単純な表現です。「現在の要素」などの反復状態はありません。代わりに、 を生成するメソッドが 1 つありIterator
ます。
AnIterator
は反復状態を持つオブジェクトです。を使用してさらに要素があるかどうかを確認し、 を使用hasNext()
して次の要素 (存在する場合) に移動できますnext()
。
通常、 はIterable
任意の数の有効な を生成できる必要がありますIterator
。
の実装は、それ自体のIterable
を提供するものです。Iterator
public interface Iterable<T>
{
Iterator<T> iterator();
}
イテレータは、割り当て特権なしでデータのコレクションをループできるようにする簡単な方法です (ただし、削除する機能はあります)。
public interface Iterator<E>
{
boolean hasNext();
E next();
void remove();
}
Javadocを参照してください。
よりよく理解できるように、特に ArrayList に関する質問に例として答えます。
- Iterable インターフェイスは、そのサブクラスに抽象メソッド 'iterator()' の実装を強制します。
public interface Iterable { ... abstract Iterator<T> iterator(); //Returns an 'Iterator'(not iterator) over elements of type T. ... }
- イテレータ インターフェイスは、そのサブクラスに抽象メソッド 'hasNext()' および 'next()' の実装を強制します。
public interface Iterator { ... abstract boolean hasNext(); //Returns true if the iteration has more elements. abstract E next(); //Returns the next element in the iteration. ... }
- ArrayList は List を実装し、List は Collection を拡張し、Collection は Iterable を拡張します。つまり、次のような関係を見ることができます。
'Iterable <- Collection <- List <- ArrayList'
. そして、Iterable、Collection、および List は、抽象メソッド 'iterator()' を宣言するだけで、ArrayList だけがそれを実装します。
- より詳細な情報については、次のように 'iterator()' メソッドを使用した ArrayList のソース コードを示します。
「iterator()」メソッドは、「Iterator」を実装するクラス「Itr」のオブジェクトを返します。
public class ArrayList<E> ... implements List<E>, ... { ... public Iterator<E> iterator() { return new Itr(); } private class Itr implements Iterator<E> { ... public boolean hasNext() { return cursor != size; } @SuppressWarnings("unchecked") public E next() { checkForComodification(); int i = cursor; if (i >= size) throw new NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) throw new ConcurrentModificationException(); cursor = i + 1; return (E) elementData[lastRet = i]; } ... } }
- 他のいくつかのメソッドまたはクラスは、Iterator (Itr) を使用して ArrayList などのコレクションの要素を反復します。
簡単な例を次に示します。
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String string = iterator.next();
System.out.println(string);
}
}
さて、それは明らかですか?:)
コレクションが反復可能な場合、反復子を使用して反復できます (したがって、for each ループで使用できます)。反復子は、コレクションを反復処理する実際のオブジェクトです。