Интерфейс java.util.Iterator используется в платформе Java Collections Framework, чтобы разрешить изменение коллекции, продолжая итерацию по ней. Если вы просто хотите аккуратно выполнить итерацию по всей коллекции, используйте вместо этого for-each, но плюс Итераторов - это функциональность, которую вы получаете: необязательная операция remove (), и еще лучше для интерфейса List Iterator, который предлагает добавление () и set () тоже операции. Оба этих интерфейса позволяют перебирать коллекцию и изменять ее структурно одновременно. Попытка изменить коллекцию во время итерации по ней с помощью for-each выдает исключение ConcurrentModificationException, обычно потому, что коллекция неожиданно изменена!
Взгляните на класс ArrayList
Внутри него есть 2 частных класса (внутренние классы).
называется Itr и ListItr
Они реализуют интерфейсы Iterator и ListIterator соответственно
открытый класс 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, они могут свободно изменять ArrayList, не вызывая исключение ConcurrentModificationException, если только вы не измените список одновременно (одновременно) с помощью set () методы add () или remove () класса ArrayList.