web-dev-qa-db-ja.com

Java列挙とイテレータの違い

これら2つのインターフェースの正確な違いは何ですか? EnumerationIterator を使用するよりも利点がありますか?誰かが詳しく説明できるなら、参考記事をいただければ幸いです。

114
cometta

Java Iterator インターフェイスのAPI仕様を見ると、 Enumerationの違いの説明があります。

イテレータは列挙と次の2つの点で異なります。

  • イテレータを使用すると、呼び出し元は、明確なセマンティクスを使用して、反復中に基本コレクションから要素を削除できます。
  • メソッド名が改善されました。

一番下の行は、EnumerationIteratorの両方が連続した要素を与えるが、Iteratorはメソッド名が短くなるように改善され、追加のremoveメソッド。以下に比較を示します。

  Enumeration                     Iterator
  ----------------                ----------------
  hasMoreElement()                hasNext()
  nextElement()                   next()
  N/A                             remove()

Java API仕様、新しいプログラムの場合は、IteratorよりもEnumerationを優先する必要があります。 Javaコレクションフレームワーク。 "( Iterator 仕様から。)

138
coobird

イテレータは フェイルファースト 。つまり、あるスレッドが追加/削除操作によってコレクションを変更すると、別のスレッドがhasNext() or next()メソッドを使用してイテレータを通過しているときに、イテレータはConcurrentModificationExceptionをスローしてすぐに失敗します。イテレータのフェイルファスト動作は、バグを検出するためにのみ使用できます。 Hashtable、Vectorなどのクラスのメソッドによって返される列挙は、多くの時間を要する現在のVectorオブジェクトをロックするnextElement()メソッド内のコードブロックを同期することで実現されるフェイルファーストではありません。

35
shaILU

「公式に」、それらは追加の操作(例えば、削除)をサポートするイテレーターインターフェースと似ているはずです。一般的に、イテレータを使用する傾向があります。

列挙インターフェースjavadocs からの抜粋です。

注:このインターフェイスの機能は、Iteratorインターフェイスによって複製されます。さらに、イテレータはオプションの削除操作を追加し、より短いメソッド名を持ちます。新しい実装では、列挙よりもイテレータの使用を検討する必要があります。

11
Uri

1つの簡単な事実ですが、以前の回答では言及していませんが、for(_type_ element:collection){...}構造の解釈に役立つ_Iterator<T>_を_Iterable<T>_とともに使用することです。

6
Earth Engine

列挙とイテレータには基本的な3つの違いがあります

列挙
1。遅延クラスにのみ使用されます(例:Vector

    Enumeration e = v.elements();  
    v is the object of `Vector` class

2.読み取り操作を実行できますが、要素を削除することはできません。
3。 2つの方法が利用可能です

  • public boolean hasNextElement();
  • public Object nextElement();

イテレータ

  1. すべてのコレクションに適用されます

    Iterator itr = c.iterator();  
    where c is any `Collection` class
    
  2. 読み取りおよび削除操作を実行できます

  3. 3つの方法が利用可能です

    • public boolean hasNext();
    • public Object next();
    • public void remove();

制限両方で

  • 前方にのみ移動
  • Add objectおよびReplace objectのメソッドはありません
5
Vipin Jain

独自のコレクションクラスを作成していて、既存のクラスを拡張したり、コレクションフレームワークインターフェイスを実装したりする場合、基本的にIteratorを使用する以外に選択肢はありません。

なんらかの理由で(考えられないことですが)、Java.util.CollectionまたはJava.util.Mapとはまったく関係のないカスタムコレクションクラスを作成している場合、still = Iterableを実装して、人々がforループでクラスを使用できるようにします。

2
Licky Lindsay

主な違いは、Enumerationはremove()メソッドを公開しないことです。さらに、イテレータは、基礎となるオブジェクトのナビゲーションと変更を同時に許可しません。それらには、並行変更などがあるかどうかを確認するためのコントロールがあるため、より多くの処理が必要になります。そのため、Enumerationのパフォーマンスは、Iteratorよりも実質的に50%高速です。このような同期を無視するナビゲーションのみが必要な場合は、列挙を使用します。

2
bnguyen82

列挙型はレガシクラス(Vector、Stack ...)にのみ使用でき、Iteratorはすべてに使用できます。

0
Jay Sheth