これら2つのインターフェースの正確な違いは何ですか? Enumeration
は Iterator
を使用するよりも利点がありますか?誰かが詳しく説明できるなら、参考記事をいただければ幸いです。
Java Iterator
インターフェイスのAPI仕様を見ると、 Enumeration
の違いの説明があります。 :
イテレータは列挙と次の2つの点で異なります。
- イテレータを使用すると、呼び出し元は、明確なセマンティクスを使用して、反復中に基本コレクションから要素を削除できます。
- メソッド名が改善されました。
一番下の行は、Enumeration
とIterator
の両方が連続した要素を与えるが、Iterator
はメソッド名が短くなるように改善され、追加のremove
メソッド。以下に比較を示します。
Enumeration Iterator
---------------- ----------------
hasMoreElement() hasNext()
nextElement() next()
N/A remove()
Java API仕様、新しいプログラムの場合は、Iterator
よりもEnumeration
を優先する必要があります。 Javaコレクションフレームワーク。 "( Iterator
仕様から。)
イテレータは フェイルファースト 。つまり、あるスレッドが追加/削除操作によってコレクションを変更すると、別のスレッドがhasNext() or next()
メソッドを使用してイテレータを通過しているときに、イテレータはConcurrentModificationException
をスローしてすぐに失敗します。イテレータのフェイルファスト動作は、バグを検出するためにのみ使用できます。 Hashtable、Vectorなどのクラスのメソッドによって返される列挙は、多くの時間を要する現在のVectorオブジェクトをロックするnextElement()
メソッド内のコードブロックを同期することで実現されるフェイルファーストではありません。
「公式に」、それらは追加の操作(例えば、削除)をサポートするイテレーターインターフェースと似ているはずです。一般的に、イテレータを使用する傾向があります。
列挙インターフェースjavadocs からの抜粋です。
注:このインターフェイスの機能は、Iteratorインターフェイスによって複製されます。さらに、イテレータはオプションの削除操作を追加し、より短いメソッド名を持ちます。新しい実装では、列挙よりもイテレータの使用を検討する必要があります。
1つの簡単な事実ですが、以前の回答では言及していませんが、for(_type_ element:collection){...}
構造の解釈に役立つ_Iterator<T>
_を_Iterable<T>
_とともに使用することです。
列挙とイテレータには基本的な3つの違いがあります
列挙
1。遅延クラスにのみ使用されます(例:Vector
)
Enumeration e = v.elements();
v is the object of `Vector` class
2.読み取り操作を実行できますが、要素を削除することはできません。
3。 2つの方法が利用可能です
イテレータ
すべてのコレクションに適用されます
Iterator itr = c.iterator();
where c is any `Collection` class
読み取りおよび削除操作を実行できます
3つの方法が利用可能です
制限両方で
Add object
およびReplace object
のメソッドはありません独自のコレクションクラスを作成していて、既存のクラスを拡張したり、コレクションフレームワークインターフェイスを実装したりする場合、基本的にIteratorを使用する以外に選択肢はありません。
なんらかの理由で(考えられないことですが)、Java.util.CollectionまたはJava.util.Mapとはまったく関係のないカスタムコレクションクラスを作成している場合、still = Iterableを実装して、人々がforループでクラスを使用できるようにします。
主な違いは、Enumerationはremove()メソッドを公開しないことです。さらに、イテレータは、基礎となるオブジェクトのナビゲーションと変更を同時に許可しません。それらには、並行変更などがあるかどうかを確認するためのコントロールがあるため、より多くの処理が必要になります。そのため、Enumerationのパフォーマンスは、Iteratorよりも実質的に50%高速です。このような同期を無視するナビゲーションのみが必要な場合は、列挙を使用します。
列挙型はレガシクラス(Vector、Stack ...)にのみ使用でき、Iteratorはすべてに使用できます。