Senior
42
Почему CopyOnWriteArrayList не бросает ConcurrentModificationException при модификации во время итерации?
Сұралған компаниялар
AI-дан жауап
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" во время прохода.