Много раз вам зададут этот вопрос в интервью. Например, как работает Iterator в Java, как он удаляет объекты из списка? При удалении объектов из списка, когда он может вызвать ConcurrentModificationException?
1. ConcurrentModificationException
В Java, когда мы создаем Iterator, он подсчитывает изменения, примененные к коллекции. Если Iterator обнаруживает, что некоторые изменения были сделаны без использования его метода(или с использованием другого итератора в той же коллекции), он больше не может гарантировать, что он не пройдет дважды по одному и тому же элементу или не пропустит один элемент во время итерации, поэтому он выдает это исключение.
2. Соответствие Modcount
Как мы знаем, методы ArrayList всегда увеличивают счетчик «modCount», объявленный как:
protected transient int modCount = 0;
Когда мы создаем Iterator/ListIterator в arraylist, этот modCount используется для инициализации expectedModCount для этого экземпляра Iterator.
int expectedModCount = modCount;
Любая операция, выполненная с ArrayList напрямую(без использования экземпляра итератора), увеличит modCount.
Все методы итератора выполняют проверку на равенство modCount == expectedModCount – перед выполнением операции. Если они не совпадают, он просто выдает исключение.
final void checkForComodification() {if(modCount != expectedModCount)throw new ConcurrentModificationException();}
Надеюсь, приведенное выше объяснение поможет вам ответить на этот вопрос интервью.