web-dev-qa-db-ja.com

iteratorとiterableの違いとそれらの使用方法は何ですか?

私はJavaが初めてで、イテレータとイテレート可能オブジェクトと本当に混同しています。誰かが私に説明し、いくつかの例を与えることができますか?

163
Charles Cai

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

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

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

169
ColinD

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

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

イテレーターは、割り当てられた特権なしで(削除することはできますが)一部のユーザーがデータのコレクションをループできるようにする簡単な方法です。

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

Javadoc を参照してください。

81
Keith Pinson

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

11
dlev

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を提供するインターフェイスです。

9
Nageswaran

あなたがよりよく理解するのを助けるために、例として特にArrayListについての質問に答えます。

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

    '反復可能<-コレクション<-リスト<-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);
    }
}

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

6
JAMES HWANG

最も重要な考慮事項は、問題のアイテムを複数回通過できるかどうかです。これは、iterator()を再度呼び出すことにより、いつでもIterableを巻き戻すことができますが、Iteratorを巻き戻す方法がないためです。

5
Praveen Kishor

リンゴが10個ある例を考えてみましょう。 Iterableを実装すると、各Appleを1〜10のボックスに入れて、ナビゲートに使用できるイテレーターを返すようなものです。

イテレータを実装することで、次のボックスなどにAppleというAppleを取得できます。

そのため、iterableを実装すると、要素をナビゲートするイテレータが提供されますが、ナビゲートするにはイテレータを実装する必要があります。

2

基本的に、両方とも非常に密接に関連しています。

Iteratorは、hasNext()のような未定義のメソッドの助けを借りてコレクションを横断するのに役立つインターフェースであると考えてください、next()およびremove()

反対に、Iterableは別のインターフェイスであり、クラスによって実装された場合、クラスを反復可能にし、For-Eachコンストラクトのターゲットになります。 。 Iteratorインターフェース自体から来るiterator()という名前のメソッドが1つだけあります。

コレクションが反復可能である場合、イテレーターを使用して反復できます。

理解するには、次をご覧ください。

ITERABLE:http://grepcode.com/file/repository.grepcode.com/Java/root/jdk/openjdk/6- b14/Java/lang/Iterable.Java

イテレータhttp://grepcode.com/file/repository.grepcode.com/Java/root/jdk/openjdk/6 -b14/Java/util/Iterator.Java

1
Doomed93

here で説明したように、「Iterable」は、foreachループで使用できるように導入されました。 Iterableインターフェースを実装するクラスは繰り返し処理できます。

Iteratorは、Iterableの繰り返しを管理するクラスです。現在の反復における現在の状態を維持し、次の要素が何であり、どのように取得するかを知っています。

1
Sangeeta

に加えて ColinD および シーカー 回答。

簡単に言えば、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
}

出典:

  1. Java Doc Iterable
  2. Java Doc Iterator
0
shahrukhamd

質問:IterableとIteratorの違いは?
Ans:

反復可能:forEachループに関連しています
iterator:コレクションに関連しています

ForEachループのターゲット要素は反復可能です。
Iteratorを使用して、コレクションからオブジェクトを1つずつ取得できます

Java.ḷangパッケージに含まれる反復可能
Java.utilパッケージに存在するイテレーター

1つのメソッドiterator()のみが含まれます
3つのメソッドhasNext()、next()、remove()が含まれます

1.5バージョンで導入
1.2バージョンで導入

0
Rf Khan

Iterableは、Javaの各ループで使用するために導入されました

public interface Collection<E> extends Iterable<E>  

Iteratorは、Iterableの繰り返しを管理するクラスです。現在の反復における現在の状態を維持し、次の要素が何であり、どのように取得するかを知っています。

0
Ranuj Mahajan