JavaのEnumeration インターフェイスには 2 つのメソッドがあります
- hasNext()
- 次()
なぜIteratorは Enumeration を拡張せず、remove method() を追加しないのですか?
また、コレクションをループするだけの場合は、ループ ステートメントに必要なのは列挙のみであるため、列挙 (または列挙を拡張する場合は反復子) で間に合わせることができます。コレクションが変更されることを心配する必要はありません
JavaのEnumeration インターフェイスには 2 つのメソッドがあります
なぜIteratorは Enumeration を拡張せず、remove method() を追加しないのですか?
また、コレクションをループするだけの場合は、ループ ステートメントに必要なのは列挙のみであるため、列挙 (または列挙を拡張する場合は反復子) で間に合わせることができます。コレクションが変更されることを心配する必要はありません
メソッドを
Iterator
拡張Enumeration
して追加しないのはなぜですか?remove()
ドキュメントから:
Iterator
Enumeration
Java Collections Framework で置き換えられます。イテレータは、次の 2 つの点で列挙型とは異なります。
- イテレータを使用すると、呼び出し元は、明確に定義されたセマンティクスを使用して、反復中に基になるコレクションから要素を削除できます。
- メソッド名が改善されました。
後者が、既存のインターフェイスを拡張するのではなく、まったく新しいインターフェイスを導入する本当の理由だと思います。
また、コレクションをループするだけの場合は、ループ ステートメントに必要なのは列挙のみであるため、列挙 (または列挙を拡張する場合は反復子) で間に合わせることができます。コレクションが変更されることを心配する必要はありません
コレクションを変更したくない場合は、 を呼び出さないでくださいremove()
。本当に自信がない場合は、Collections.unmodifiableCollection()
et al を使用して読み取り専用ラッパーを作成できます。
remove()
最後に、for-each ループを使用してコレクションを反復処理する場合、とにかくメソッドにアクセスできないことに注意してください。
for (String s : str_list) {
...
}
ここでは、Iterator
インターフェイスを使用していますが、実際の反復子オブジェクトにはアクセスできません。
java.util.Collections.enumeration()メソッドを使用して、コレクションから java.util.Enumerator を取得できます。
とにかく、イテレーターを介してコレクションを変更したくない場合は、remove() メソッドを呼び出さないことだけが問題です。
http://www.journaldev.com/1330/java-collections-interview-questions-and-answers#iterator-vs-enumerationによると、「列挙は反復子の 2 倍の速さであり、使用するメモリは非常に少なくなります。列挙は非常に基本的なものです。基本的なニーズに適合します。」
したがって、remove() が必要ない場合は、Enumeration を使用する方が Iterator を使用するよりも効果的だと思います。