Назад к вопросам
СБЕР
Senior
7
Почему CopyOnWriteArrayList не бросает ConcurrentModificationException при модификации во время итерации?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
CopyOnWriteArrayList не бросает ConcurrentModificationException при модификации во время итерации, потому что его итераторы работают по снимку (snapshot) массива, который был актуален на момент создания итератора.
В отличие от обычных коллекций, где итератор отслеживает изменения структуры коллекции и при обнаружении модификации выбрасывает исключение, CopyOnWriteArrayList при каждой модификации создает новый копированный массив с изменениями. Итератор же продолжает работать с неизменяемым массивом, который был в момент его создания.
Это обеспечивает:
- Безопасную итерацию без ConcurrentModificationException.
- Итератор видит консистентное состояние коллекции на момент начала итерации.
Однако стоит учитывать, что:
- Модификации (add, remove и т.п.) дорогостоящие из-за копирования массива.
- Итератор не отражает изменения, сделанные после его создания.
Пример:
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("A");
list.add("B");
for (String s : list) {
System.out.println(s);
list.add("C"); // не вызовет ConcurrentModificationException
}
В этом примере итератор не увидит добавленный "C" во время прохода.