これら2つのインターフェースの正確な違いは何ですか?Enumeration
を使用するよりもメリットがありますIterator
か?誰かが詳しく説明できたら、参考記事をいただければ幸いです。
これら2つのインターフェースの正確な違いは何ですか?Enumeration
を使用するよりもメリットがありますIterator
か?誰かが詳しく説明できたら、参考記事をいただければ幸いです。
回答:
Iterator
インターフェースのJava API仕様を見ると、次の違いの説明がありますEnumeration
。
イテレータは、次の2つの点で列挙と異なります。
- イテレータを使用すると、明確に定義されたセマンティクスでの反復中に、呼び出し元が基になるコレクションから要素を削除できます。
- メソッド名が改善されました。
一番下の行は、両方でEnumeration
ありIterator
、連続する要素を提供しますがIterator
、メソッド名が短くなるように改善され、メソッドが追加されていremove
ます。並べて比較します:
Enumeration Iterator
---------------- ----------------
hasMoreElement() hasNext()
nextElement() next()
N/A remove()
Java API仕様でも述べられているように、「イテレータはJavaコレクションフレームワークの列挙の代わりになる」Iterator
ので、新しいプログラムではを優先する必要がEnumeration
あります。(Iterator
仕様より)
イテレータはフェイルファストです。つまり、あるスレッドが追加/削除操作によってコレクションを変更しているときに、別のスレッドがIterator using hasNext() or next()
メソッドを使用してコレクションをトラバースしているときに、イテレータがスローすると失敗しますConcurrentModificationException
。イテレータのフェイルファスト動作は、バグを検出するためにのみ使用できます。Hashtable、Vectorなどのクラスのメソッドによって返される列挙型は、nextElement()
多くの時間を要する現在のVectorオブジェクトをロックするメソッド内のコードのブロックを同期することによって実現されるフェイルファストではありません。
「公式に」、それらは追加の操作(たとえば、削除)をサポートするイテレータインターフェースと同様であると想定されています。一般的には、反復子を使用する傾向があります。
以下は列挙インターフェースjavadocsからのものです。
注:このインターフェースの機能は、Iteratorインターフェースと同じです。さらに、Iteratorはオプションの削除操作を追加し、メソッド名が短くなっています。新しい実装では、列挙よりもイテレータの使用を検討する必要があります。
EnumerationとIteratorには基本的な3つの違いがあります
列挙
1.それだけでlagacyクラスの使用である(例えば。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
主な違いは、列挙がremove()メソッドを公開しないことです。さらに、Iteratorは、基礎となるオブジェクトのナビゲーションと変更を同時に許可しません。彼らは、同時変更などがあるかどうかを確認するコントロールを持っているため、より多くの処理が必要です。したがって、列挙のパフォーマンスはイテレーターよりも実質的に50%高速です。このような同期を無視してナビゲーションのみが必要な場合は、列挙を使用します。
1)イテレータと列挙の主な違いは、コレクションをトラバースする際の要素の削除です。イテレータは、remove()メソッドを備えているため、コレクションのトラバーサル中に要素を削除できます。列挙には、remove()メソッドはありません。
2)列挙は本質的にフェイルセーフです。トラバーサル中にコレクションが変更されても、ConcurrentModificationExceptionはスローされません。イテレータは本質的にフェイルファストです。独自のremove()メソッド以外の反復中にコレクションが変更されると、ConcurrentModificationExceptionをスローします。
3)列挙は、Vector、Hashtableのトラバースに使用されるレガシーインターフェイスです。イテレータはレガシーインターフェイスではありません。イテレータはHashMap、LinkedList、ArrayList、HashSet、TreeMap、TreeSetのトラバーサルに使用できます。