これら2つのインターフェースの正確な違いは何ですか?Enumeration
使用するよりもメリットはありますIterator
か?誰かが詳しく説明できれば、参考記事をいただければ幸いです。
10 に答える
インターフェイスの Java API 仕様を見ると、次Iterator
の違いについての説明がありますEnumeration
。
イテレータは、次の 2 つの点で列挙型とは異なります。
- イテレータを使用すると、呼び出し元は、明確に定義されたセマンティクスを使用して、反復中に基になるコレクションから要素を削除できます。
- メソッド名が改善されました。
Enumeration
肝心なのは、との両方Iterator
が連続する要素を与えることIterator
ですが、言い回しを短くすることでメソッド名を改善し、追加のremove
メソッドを持っています。以下は、並べて比較したものです。
Enumeration Iterator
---------------- ----------------
hasMoreElements() hasNext()
nextElement() next()
N/A remove()
Java API 仕様にも記載されているように、新しいプログラムでは、「イテレータは Java コレクション フレームワークで Enumeration に取って代わる」ため、 よりIterator
も優先する必要があります。Enumeration
(Iterator
仕様より)
イテレータはフェイルファストです。つまり、あるスレッドが追加/削除操作によってコレクションを変更し、別のスレッドがhasNext() or next()
メソッドを使用するイテレーターを介してコレクションをトラバースしている場合、イテレーターはスローによってすぐに失敗しますConcurrentModificationException
。イテレータのフェイルファスト動作は、バグを検出するためにのみ使用できます。nextElement()
Hashtable、Vector などのクラスのメソッドによって返される列挙型は、多くの時間がかかる現在の Vector オブジェクトをロックするメソッド内のコード ブロックを同期することによって実現されるフェイル ファストではありません。
「公式には」、これらは、追加の操作 (削除など) をサポートするイテレータ インターフェイスと同様であると想定されています。一般に、反復子を使用する傾向があります。
以下は、列挙型インターフェース javadocsからのものです。
注: このインターフェイスの機能は、Iterator インターフェイスによって複製されます。さらに、Iterator はオプションの remove 操作を追加し、メソッド名を短くしています。新しい実装では、列挙型よりも反復子を使用することを検討する必要があります。
単純な事実ですが、以前の回答で言及されていないのは、構造の解釈にIterator<T>
使用されることです。Iterable<T>
for(_type_ element:collection){...}
主な違いは、列挙が remove() メソッドを公開しないことです。さらに、Iterator では、基になるオブジェクトのナビゲーションと変更を同時に行うことはできません。それらには、同時変更などがあるかどうかを確認するためのコントロールがあるため、より多くの処理が必要になります。したがって、Enumeration のパフォーマンスは Iterator より実質的に 50% 高速です。このような同期を無視してナビゲーションのみが必要な場合は、Enumeration を使用してください。
独自のコレクション クラスを作成していて、既存のクラスを拡張したり、コレクション フレームワーク インターフェイスを実装したりする場合は、基本的に Iterator を使用するしかありません。
なんらかの理由 (私には思いつきません) で、java.util.Collection または java.util.Map にまったく関係のないカスタム コレクション クラスを作成している場合でも、人々が使用できるように Iterable を実装する必要があります。あなたのクラスを for ループに入れます。
Enumeration はレガシー クラス (Vector、Stack...) にのみ使用できますが、Iterator はすべてに使用できます。
反復子と列挙型の両方を使用してデータを取得します。違いは、列挙型は従来のクラス、つまりベクトル/スタックにのみ使用できるのに対し、反復子は残りのクラスに使用できることです。列挙は、マップに設定されたキーにも使用できます。