以下を行うことは可能ですか?
List<String> list = new ArrayList<String>();
Iterator<String> iterator = list.listIterator();
populateList(list);
リストを作成し、リストにデータを入力する前にイテレータを取得しています。イテレータを使用してリストの要素を取得できますか? イテレータを取得して配列に入力する順序に違いはありますか?
どんな助けでも大歓迎です。
以下を行うことは可能ですか?
List<String> list = new ArrayList<String>();
Iterator<String> iterator = list.listIterator();
populateList(list);
リストを作成し、リストにデータを入力する前にイテレータを取得しています。イテレータを使用してリストの要素を取得できますか? イテレータを取得して配列に入力する順序に違いはありますか?
どんな助けでも大歓迎です。
はい、それは重要です。イテレータでまたはを使用すると、ConcurrentModificationExceptionが発生します。のイテレータはフェイルファストです。つまり、要素の追加または削除によって arraylist の基本構造が変更されるとすぐに CME がスローされます。hasNext()
next()
ArrayList
編集:checkForComodification()
hasNext() と next() で
イテレータを最初に呼び出す
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
Java は、そのデータ構造でタイムスタンプを使用します。next()
orメソッドを実行する前にhasNext()
、タイムスタンプがイテレータを作成したときのタイムスタンプと等しいかどうかがチェックされます。
その理由は、たとえば a の場合HashSet<T>
、反復子を定義できますが、要素を追加した後、順序が同じであるとは限りません。したがって、アクティブな反復子はいくつかのアイテムを複数回生成する可能性があり、他のアイテムはまったく反復されません。