私はJavaが初めてで、イテレータとイテレート可能オブジェクトと本当に混同しています。誰かが私に説明し、いくつかの例を与えることができますか?
Iterable
は、反復可能な一連の要素の単純な表現です。 「現在の要素」などの反復状態はありません。代わりに、Iterator
を生成するメソッドが1つあります。
Iterator
は、反復状態を持つオブジェクトです。 hasNext()
を使用してさらに要素があるかどうかを確認し、next()
を使用して次の要素(存在する場合)に移動できます。
通常、Iterable
は、任意の数の有効なIterator
sを生成できる必要があります。
Iterable
の実装は、それ自体のIterator
を提供するものです。
public interface Iterable<T>
{
Iterator<T> iterator();
}
イテレーターは、割り当てられた特権なしで(削除することはできますが)一部のユーザーがデータのコレクションをループできるようにする簡単な方法です。
public interface Iterator<E>
{
boolean hasNext();
E next();
void remove();
}
Javadoc を参照してください。
コレクションが反復可能である場合、反復子を使用して反復できます(したがって、for eachループで使用できます)。反復子は、コレクションを反復処理する実際のオブジェクトです。
Iterableインターフェイスを実装すると、オブジェクトを「foreach」ステートメントのターゲットにすることができます。
class SomeClass implements Iterable<String> {}
class Main
{
public void method()
{
SomeClass someClass = new SomeClass();
.....
for(String s : someClass) {
//do something
}
}
}
Iteratorは、要素を反復処理するための実装を持つインターフェイスです。 Iterableは、Iteratorを提供するインターフェイスです。
あなたがよりよく理解するのを助けるために、例として特にArrayListについての質問に答えます。
public interface Iterable { ... abstract Iterator<T> iterator(); //Returns an 'Iterator'(not iterator) over elements of type T. ... }
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'
。 Iterable、Collection、Listは抽象メソッド '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]; } ... } }
以下に簡単な例を示します。
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);
}
}
今、それは明らかですか? :)
最も重要な考慮事項は、問題のアイテムを複数回通過できるかどうかです。これは、iterator()を再度呼び出すことにより、いつでもIterableを巻き戻すことができますが、Iteratorを巻き戻す方法がないためです。
リンゴが10個ある例を考えてみましょう。 Iterableを実装すると、各Appleを1〜10のボックスに入れて、ナビゲートに使用できるイテレーターを返すようなものです。
イテレータを実装することで、次のボックスなどにAppleというAppleを取得できます。
そのため、iterableを実装すると、要素をナビゲートするイテレータが提供されますが、ナビゲートするにはイテレータを実装する必要があります。
基本的に、両方とも非常に密接に関連しています。
Iteratorは、hasNext()のような未定義のメソッドの助けを借りてコレクションを横断するのに役立つインターフェースであると考えてください、next()およびremove()
反対に、Iterableは別のインターフェイスであり、クラスによって実装された場合、クラスを反復可能にし、For-Eachコンストラクトのターゲットになります。 。 Iteratorインターフェース自体から来るiterator()という名前のメソッドが1つだけあります。
コレクションが反復可能である場合、イテレーターを使用して反復できます。
理解するには、次をご覧ください。
here で説明したように、「Iterable」は、foreach
ループで使用できるように導入されました。 Iterableインターフェースを実装するクラスは繰り返し処理できます。
Iteratorは、Iterableの繰り返しを管理するクラスです。現在の反復における現在の状態を維持し、次の要素が何であり、どのように取得するかを知っています。
簡単に言えば、IterableおよびIteratorは両方ともJavaのコレクションで提供されるインターフェースですフレームワーク。
反復可能
for-eachループを使用してコレクションを反復処理する場合、クラスはIterableインターフェイスを実装する必要があります。ただし、for-eachループは、コレクションを順方向に循環するためにのみ使用でき、このコレクションの要素を変更することはできません。しかし、必要なのが要素データの読み取りだけである場合、それは非常に単純であり、Javaラムダ式のおかげで、多くの場合1つのライナーです。例えば:
iterableElements.forEach (x -> System.out.println(x) );
イテレータ
このインターフェイスを使用すると、コレクションを反復処理して、その要素を取得および削除できます。各コレクションクラスは、コレクションの先頭にイテレータを返すiterator()メソッドを提供します。反復可能に対するこのインターフェイスの利点は、このインターフェイスを使用すると、コレクション内の要素を追加、変更、または削除できることです。ただし、要素にアクセスするには、反復可能なコードよりも少し多くのコードが必要です。例えば:
for (Iterator i = c.iterator(); i.hasNext(); ) {
Element e = i.next(); //Get the element
System.out.println(e); //access or modify the element
}
出典:
質問:IterableとIteratorの違いは?
Ans:
反復可能:forEachループに関連しています
iterator:コレクションに関連しています
ForEachループのターゲット要素は反復可能です。
Iteratorを使用して、コレクションからオブジェクトを1つずつ取得できます
Java.ḷangパッケージに含まれる反復可能
Java.utilパッケージに存在するイテレーター
1つのメソッドiterator()のみが含まれます
3つのメソッドhasNext()、next()、remove()が含まれます
1.5バージョンで導入
1.2バージョンで導入
Iterable
は、Javaの各ループで使用するために導入されました
public interface Collection<E> extends Iterable<E>
Iterator
は、Iterable
の繰り返しを管理するクラスです。現在の反復における現在の状態を維持し、次の要素が何であり、どのように取得するかを知っています。