1

私はまだJavaに慣れていないので、今日はイテレータの使用法を理解しようとしています。
だから私はいくつかの質問があります:

  1. Iterableを実装する必要があるのはなぜですか。コレクションの新しいイテレーターを作成するメソッドしか提供しませんが、すべての要素を取得したい場合は、通常のforループまたはエンチャントされたforループを使用することもできます。私はすでにこの質問を読みました:Iterableインターフェースは何に使用されますか?その他にも、すべての要素を反復処理できると言われているだけなので、私の質問に戻ります。

  2. Iterableを実装する場合、Iteratorも実装する必要がありますか?
    これは実際に上書きするのに役立つ可能性のあるメソッドを提供するためです。
    たとえば、オブジェクトをループに入れるかどうかに関係なく、クラスにブール値がある場合、次のように記述できます。

    public boolean hasNext() {
    if(loop)
        return true;
       //other things
    }
    
  3. 2.で述べたように、エンチャントされたforループはこれらの上書きされたメソッドを使用しますか?
    たとえば、上記のループ属性の場合:forループは、それがtrueの場合、無限に実行されますか?

誰かが私がこの概念全体をよりよく理解するのを手伝ってくれることを願っています。

4

1 に答える 1

4

コレクションを定義している場合Iterable. たとえば、カスタム リストを作成する場合、通常はAbstractList、それ自体が を拡張AbstractCollectionし、 を実装しCollection、 を実装するサブクラスにしますIterable。したがって、リストは「事実上」になりますIterable

ただし、 をサブクラスAbstractList化する場合、このメソッドは既にそこに実装されているため、反復子を自分で実装する必要はありません。とはいえ、ニーズに合わせて特殊なイテレータを提供することもできます。

実装するときIterable(本当にしたい場合)、 を返しますIterator。コレクション自体は を実装すべきではIteratorなく、返されたイテレータのみを実装すべきです。それがどのように行われるかを見る例については、AbstractListソースを見てください。

拡張 for ループを使用している場合、Iterable. 強化された for ループは、 によって返されるイテレータのループの単なる構文糖衣ですiterator()。これは、コンパイラがイテレータを使用するようにコードを変換することを意味します。Iterableこれが、強化された for ループでコレクションを使用するために実装する必要がある理由です。

于 2013-03-14T18:48:38.267 に答える