Ответ
Итератор работает с "снимком" (snapshot) массива на момент своего создания. Это гарантирует отсутствие ConcurrentModificationException.
Механизм:
- При вызове
iterator()создается копия текущего внутреннего массива. - Все модифицирующие операции (
add,set,remove) работают с новой копией массива. - Итератор продолжает обход исходного снимка, не видя последующих изменений.
Пример:
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(List.of("A", "B"));
Iterator<String> iterator = list.iterator();
list.add("C"); // Создается новая копия массива [A, B, C]
while (iterator.hasNext()) {
System.out.print(iterator.next() + " "); // Выводит: A B (старый снимок)
}
System.out.println(list); // Выводит: [A, B, C] (актуальное состояние)
Характеристики и применение:
- Плюс: Полная безопасность при итерации.
- Минус: Итератор не отражает изменения после его создания; операции записи дороги из-за копирования массива.
- Идеально подходит для сценариев «частое чтение, редкая запись» (read-heavy).