回答:
理解を深めるために、特に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);
}
}
さて、それは明らかですか?:)
Iterable<T>
このシナリオであるメソッドを作成する場合、どのような手順を実装する必要がありますか?その例も提案してください。
コレクションが反復可能である場合、反復子を使用して反復できます(その結果、for eachループで使用できます)。反復子は、コレクションを反復処理する実際のオブジェクトです。
java.lang.Iterable
ますか?
java.lang.Iterable
Iterableインターフェースを実装すると、オブジェクトを「foreach」ステートメントのターゲットにすることができます。
class SomeClass implements Iterable<String> {}
class Main
{
public void method()
{
SomeClass someClass = new SomeClass();
.....
for(String s : someClass) {
//do something
}
}
}
イテレーターは、要素を反復するための実装を持つインターフェースです。Iterableは、Iteratorを提供するインターフェースです。
最も重要な考慮事項は、問題のアイテムを複数回トラバースできるようにするかどうかです。これは、iterator()を再度呼び出すことで常にIterableを巻き戻すことができますが、Iteratorを巻き戻す方法がないためです。
リンゴが10個ある例を考えてみましょう。Iterableを実装する場合、各リンゴを1から10のボックスに入れ、ナビゲートに使用できるイテレータを返すようなものです。
イテレータを実装することで、任意のリンゴ、次のボックスのリンゴなどを取得できます。
したがって、反復可能オブジェクトを実装すると、要素をナビゲートするためのイテレータが提供されますが、ナビゲートするには、イテレータを実装する必要があります。
質問:IterableとIteratorの違いは何ですか?
回答:
iterable:これはforEachループ
イテレーターに関連しています:Isはコレクションに関連しています
forEachループのターゲット要素は反復可能でなければなりません。
イテレータを使用して、コレクションからオブジェクトを1つずつ取得できます。
java.ḷangパッケージに存在するイテラブル
java.utilパッケージに存在するイテレーター
1つのメソッドのみを含むiterator()
3つのメソッドを含むhasNext()、next()、remove()
1.5バージョンで
導入1.2バージョンで導入
基本的には、両者は非常に密接に関連しています。
Iteratorを、hasNext()、next()、およびremove()などの未定義のメソッドを使用してコレクションをトラバースするのに役立つインターフェースであると考えてください
反対に、Iterableは別のインターフェイスであり、クラスによって実装されると、クラスが強制的にIterableになり、For-Each構成のターゲットになります。Iteratorインターフェイス自体に由来するiterator()という名前のメソッドは1つだけです。
コレクションが反復可能である場合は、イテレーターを使用して反復できます。
理解のためにこれらを訪問してください:
ITERABLE: http ://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Iterable.java
ITERATOR http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Iterator.java
私はこれが古い質問であることを知っていますが、これを読んで同じ質問に悩まされ、すべての用語に圧倒される可能性のある人のために、イテラブルとイテレータのこの違いを理解するのに役立つ、簡単な類推を示します。
公共図書館を考えてみてください。古い学校。紙の本付き。はい、そのようなライブラリです。
本だらけの棚はイタラブルのようです。棚には長い本が並んでいます。何冊か分からないかもしれませんが、これは長い本のコレクションであることがわかります。
ライブラリアンはイテレーターのようなものです。彼はいつでも特定の本を指すことができます。彼は彼が指しているその場所で本を挿入/削除/修正/読むことができます。「次へ」と叫ぶたびに、彼は順番に各本を順番に指さします。彼に。したがって、通常は彼に「次はありますか?」と尋ねると、彼は「はい」と言い、それに「次へ」と言います。そして彼は次の本を指すでしょう。また、棚の最後に達したことも知っているので、「次はありますか?」と尋ねると、彼は「いいえ」と言うでしょう。
私はそれが少しばかげていることを知っていますが、これが役に立てば幸いです。
簡単に言うと、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
Javaの各ループで使用するために導入されました
public interface Collection<E> extends Iterable<E>
Iterator
の反復を管理するクラスですIterable
。現在のイテレーションの現在の状態を維持し、次の要素とは何か、そしてそれを取得する方法を知っています。
Iterable
があるinteral
か、external
イテレータがあるか、またはそれらのいずれかを持つことが可能かどうかは問題になりますか?