Добрый вечер! Такой вопрос: почему итератор выбрасывает ConcurrentModificationException, если мы структурно изменяет лист после создания итератора? Как проходит проверка с помощью modCount я понимаю, только вот для чего все это? Созданный объект Итератор ведь все равно сверяет фокус с полем size листа и вроде как не хранит больше никакой инфы о листе. Как мы можем помешать корректной итерации, изменив лист после создания итератор?
Например, если вы вставили элемент в начало списка, а итератор уже был на середине, то на следующем вызове
iterator.next() вы повторно вернёте предыдущий элемент. А если удалили из начала, то вы пропустите следующий элемент. Ну и не забывайте, что конкурентное обновление может быть из другого потока, и обновление size можно и не увидеть. Ещё итератор вправе захватить внутренний массив ArrayList для скорости. Если вы вставили новый элемент и это потребовало перевыделения массива, то итератор будет идти по старому массиву. Это может привести к ArrayIndexOutOfBoundsException, либо вы вернёте null'ы, которые были в конце исходного массива. В общем, возможно много разных интересных багов