231

私はJavaが初めてで、イテレータとイテラブルと本当に混同しています。誰かが私に説明して、いくつかの例を挙げてもらえますか?

4

14 に答える 14

244

anIterableは、反復可能な一連の要素の単純な表現です。「現在の要素」などの反復状態はありません。代わりに、 を生成するメソッドが 1 つありIteratorます。

AnIteratorは反復状態を持つオブジェクトです。を使用してさらに要素があるかどうかを確認し、 を使用hasNext()して次の要素 (存在する場合) に移動できますnext()

通常、 はIterable任意の数の有効な を生成できる必要がありますIterator

于 2011-07-28T17:41:40.397 に答える
98

の実装は、それ自体のIterableを提供するものです。Iterator

public interface Iterable<T>
{
    Iterator<T> iterator();
}

イテレータは、割り当て特権なしでデータのコレクションをループできるようにする簡単な方法です (ただし、削除する機能はあります)。

public interface Iterator<E>
{
    boolean hasNext();
    E next();
    void remove();
}

Javadocを参照してください。

于 2011-07-28T17:43:39.557 に答える
28

よりよく理解できるように、特に ArrayList に関する質問に例として答えます。

  1. Iterable インターフェイスは、そのサブクラスに抽象メソッド 'iterator()' の実装を強制します。
public interface Iterable {
  ...
  abstract Iterator<T> iterator(); //Returns an 'Iterator'(not iterator) over elements of type T.
  ...
}
  1. イテレータ インターフェイスは、そのサブクラスに抽象メソッド '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.
  ...
}
  1. ArrayList は List を実装し、List は Collection を拡張し、Collection は Iterable を拡張します。つまり、次のような関係を見ることができます。

    'Iterable <- Collection <- List <- ArrayList'

. そして、Iterable、Collection、および List は、抽象メソッド 'iterator()' を宣言するだけで、ArrayList だけがそれを実装します。

  1. より詳細な情報については、次のように '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];
          }
          ...
  }
}
  1. 他のいくつかのメソッドまたはクラスは、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);
    }
}

さて、それは明らかですか?:)

于 2017-12-08T01:50:45.680 に答える
15

コレクションが反復可能な場合、反復子を使用して反復できます (したがって、for each ループで使用できます)。反復子は、コレクションを反復処理する実際のオブジェクトです。

于 2011-07-28T17:39:46.743 に答える