2

JavaのEnumeration インターフェイスには 2 つのメソッドがあります

  1. hasNext()
  2. 次()

なぜIteratorは Enumeration を拡張せず、remove method() を追加しないのですか?

また、コレクションをループするだけの場合は、ループ ステートメントに必要なのは列挙のみであるため、列挙 (または列挙を拡張する場合は反復子) で間に合わせることができます。コレクションが変更されることを心配する必要はありません

4

3 に答える 3

7

メソッドをIterator拡張Enumerationして追加しないのはなぜですか?remove()

ドキュメントから:

IteratorEnumerationJava Collections Framework で置き換えられます。イテレータは、次の 2 つの点で列挙型とは異なります。

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

後者が、既存のインターフェイスを拡張するのではなく、まったく新しいインターフェイスを導入する本当の理由だと思います。

また、コレクションをループするだけの場合は、ループ ステートメントに必要なのは列挙のみであるため、列挙 (または列挙を拡張する場合は反復子) で間に合わせることができます。コレクションが変更されることを心配する必要はありません

コレクションを変更したくない場合は、 を呼び出さないでくださいremove()。本当に自信がない場合は、Collections.unmodifiableCollection()et al を使用して読み取り専用ラッパーを作成できます。

remove()最後に、for-each ループを使用してコレクションを反復処理する場合、とにかくメソッドにアクセスできないことに注意してください。

for (String s : str_list) {
   ...
}

ここでは、Iteratorインターフェイスを使用していますが、実際の反復子オブジェクトにはアクセスできません。

于 2013-03-06T10:35:30.943 に答える
2

java.util.Collections.enumeration()メソッドを使用して、コレクションから java.util.Enumerator を取得できます。

とにかく、イテレーターを介してコレクションを変更したくない場合は、remove() メソッドを呼び出さないことだけが問題です。

于 2013-03-06T10:35:06.763 に答える
-1

http://www.journaldev.com/1330/java-collections-interview-questions-and-answers#iterator-vs-enumerationによると、「列挙は反復子の 2 倍の速さであり、使用するメモリは非常に少なくなります。列挙は非常に基本的なものです。基本的なニーズに適合します。」

したがって、remove() が必要ない場合は、Enumeration を使用する方が Iterator を使用するよりも効果的だと思います。

于 2014-02-25T09:33:37.597 に答える