Почему Java Iterator выдает исключение ConcurrentModificationException?

Много раз вам зададут этот вопрос в интервью. Например, как работает 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();}

Надеюсь, приведенное выше объяснение поможет вам ответить на этот вопрос интервью.

Прокрутить вверх