java.util.Iterator インターフェイスは、Java Collections Framework で使用され、コレクションを反復しながらコレクションを変更できるようにします。コレクション全体をきれいに反復したいだけの場合は、代わりに for-each を使用しますが、イテレーターの利点は、オプションの remove() 操作を利用できる機能です。 () および set() 操作も。これらのインターフェースはどちらも、コレクションを繰り返し処理し、同時に構造的に変更することを可能にします。コレクションを for-each で反復処理中に変更しようとすると、ConcurrentModificationException がスローされます。これは通常、コレクションが予期せず変更されるためです。
ArrayList クラスを見てください。
内部には Itr と ListItr という 2 つのプライベート クラス (内部クラス) があります。
これらは、それぞれ Iterator および ListIterator インターフェースを実装します。
public class ArrayList..... { //エンクロージング クラス
private class Itr implements Iterator<E> {
public E next() {
return ArrayList.this.get(index++); //rough, not exact
}
//we have to use ArrayList.this.get() so the compiler will
//know that we are referring to the methods in the
//enclosing ArrayList class
public void remove() {
ArrayList.this.remove(prevIndex);
}
//checks for...co mod of the list
final void checkForComodification() { //ListItr gets this method as well
if (ArrayList.this.modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
}
}
private class ListItr extends Itr implements ListIterator<E> {
//methods inherted....
public void add(E e) {
ArrayList.this.add(cursor, e);
}
public void set(E e) {
ArrayList.this.set(cursor, e);
}
}
}
メソッド iterator() および listIterator() を呼び出すと、プライベート クラス Itr または ListItr の新しいインスタンスが返されます。これらの内部クラスは、それを囲む ArrayList クラスの「内部」にあるため、ConcurrentModificationException をトリガーすることなく、ArrayList を自由に変更できます。 ArrayList クラスの set() add() または remove() メソッドを使用して同時に (同時に) リストを変更しない限り。