133

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

4

10 に答える 10

155

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

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

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

Enumeration肝心なのは、との両方Iteratorが連続する要素を与えることIteratorですが、言い回しを短くすることでメソッド名を改善し、追加のremoveメソッドを持っています。以下は、並べて比較したものです。

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

Java API 仕様にも記載されているように、新しいプログラムでは、「イテレータは Java コレクション フレームワークで Enumeration に取って代わる」ため、 よりIteratorも優先する必要があります。EnumerationIterator仕様より)

于 2009-06-04T01:46:24.030 に答える
39

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

于 2012-10-26T06:26:52.410 に答える
12

「公式には」、これらは、追加の操作 (削除など) をサポートするイテレータ インターフェイスと同様であると想定されています。一般に、反復子を使用する傾向があります。

以下は、列挙型インターフェース javadocsからのものです。

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

于 2009-06-04T01:48:00.547 に答える
6

単純な事実ですが、以前の回答で言及されていないのは、構造の解釈にIterator<T>使用されることです。Iterable<T>for(_type_ element:collection){...}

于 2013-02-25T22:46:29.073 に答える
2

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

于 2012-03-10T10:34:40.607 に答える
2

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

なんらかの理由 (私には思いつきません) で、java.util.Collection または java.util.Map にまったく関係のないカスタム コレクション クラスを作成している場合でも、人々が使用できるように Iterable を実装する必要があります。あなたのクラスを for ループに入れます。

于 2009-06-04T02:28:14.537 に答える
0

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

于 2016-09-04T03:56:02.060 に答える
-2

反復子と列挙型の両方を使用してデータを取得します。違いは、列挙型は従来のクラス、つまりベクトル/スタックにのみ使用できるのに対し、反復子は残りのクラスに使用できることです。列挙は、マップに設定されたキーにも使用できます。

于 2012-08-17T08:01:57.857 に答える