イテレーターとリステレーターの違いは?


138
Iterator ite = Set.iterator();
Iterator ite = List.iterator();

ListIterator listite = List.listIterator();

Iteratora Setまたはa Listまたはをトラバースするために使用できますMap。しかし、ListIteratorをトラバースするためにのみ使用Listでき、をトラバースすることはできませんSet。どうして?

主な違いは、イテレータでは一方向にしか移動できないが、両方向ListIteratorには移動できることです。他に違いはありますか?そして、ListIterator以上の利点Iterator


ピーターズの回答に加えて、Javaでのイテレータについての考えの章を読み、そこにすべての優れた例を紹介することをお勧めします
ant

回答:


150

違いは、ListIteratorのJavadocにリストされています。

あなたはできる

  • 逆方向に繰り返す
  • イテレータはいつでも取得できます。
  • 任意の時点で新しい値を追加します。
  • その時点で新しい値を設定します。

68
そして、あなたがa Setでそれを行うことができない理由は単純です:「現在のポイント」がない:要素にはインデックスがなく、別の要素の「前」または「後」に要素を追加できる便利な方法はありません。
Joachim Sauer

@Peter Lawrey はいつでもインデックスを取得します -それはメソッドpreviousIndex()およびnextIndex()についてですか?
gstackoverflow 14

2
@gstackoverflowチェックjava.util.List#listIterator(int)
キロネット2014年

4
@kilonetは、任意の時点インデックス取得する代わりに、混乱を避けるために「任意の時点でイテレータを取得する」のように記述する必要がありますか?
Shailesh Pratapwar、2015

39

2つの違いがあります。

  1. イテレータを使用して、セットとリスト、およびマップタイプのオブジェクトをトラバースできます。ListIteratorは、リストタイプのオブジェクトのトラバースに使用できますが、セットタイプのオブジェクトのトラバースには使用できません。

    つまり、SetとListを使用してIteratorオブジェクトを取得できます。以下を参照してください。

    Iteratorを使用することにより、コレクションオブジェクトから要素を順方向にのみ取得できます。

    イテレーターのメソッド:

    1. hasNext()
    2. next()
    3. remove()
    Iterator iterator = Set.iterator();
    Iterator iterator = List.iterator();
  2. ただし、ListIteratorオブジェクトはListインターフェースからのみ取得します。ここを参照してください。

    ここで、ListIteratorを使用すると、どちらの方向(前方と後方の両方)にもトラバースできます。そのため、Iteratorのメソッドと同様にhasPrevious()、さらに2つのメソッドがあり previous()ます。また、次の要素または前の要素のインデックスを取得できます(nextIndex() およびをpreviousIndex()それぞれ使用)

    ListIteratorのメソッド:

    1. hasNext()
    2. 次()
    3. 前()
    4. hasPrevious()
    5. 削除する()
    6. nextIndex()
    7. previousIndex()
    ListIterator listiterator = List.listIterator();

    つまり、SetインターフェースからListIteratorオブジェクトを取得できません。

参照:-IteratorとListIteratorの違いは何ですか?


39
これは、kirankumarjava.blogspot.com / 2013/06 /…から大幅にカットアンドペーストされているようです。あなたは常に元の作者を認めなければなりません。
Cameron Skinner、

25

IteratorはListIteratorのスーパークラスです。

これらの違いは次のとおりです。

  1. を使用iteratorすると、前方にのみ移動できますがListIterator、要素を読みながらバックワードを移動することもできます。
  2. を使用ListIteratorすると、トラバース中の任意の時点でインデックスを取得できますが、これはiterators では不可能です。
  3. ではiterator、利用可能な次の要素のみをチェックできますが、listiterator前と次の要素をチェックできます。
  4. ではlistiteratorもし、時間の任意の時点でトラバースしながら、新しい要素を追加することができます。では不可能iteratorです。
  5. ではlistiterator、トラバース中に要素を変更できますが、では不可能iteratorです。

イテレータのルックアンドフィール:

 public interface Iterator<E> {
    boolean hasNext();
    E next();
    void remove(); //optional-->use only once with next(), 
                         dont use it when u use for:each
    }

ListIteratorのルックアンドフィール:

public interface ListIterator<E> extends Iterator<E> {
    boolean hasNext();
    E next();
    boolean hasPrevious();
    E previous();
    int nextIndex();
    int previousIndex();
    void remove(); //optional
    void set(E e); //optional
    void add(E e); //optional
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.