Как известно, если
ArrayList<> поменять во время итерации, то Java кинет исключение java.util.ConcurrentModificationException. Однако это можно обойти. Рассмотрим такой код:import java.io.*;Он не кидает никаких исключений, хотя между увеличением и созданием итератора проходит много модификаций! Объяснение такое: у
import java.util.*;
public class ExceptionHack {
public static void main(String[] args) {
ArrayList<Integer> arrayList = new ArrayList<>(List.of(1, 2, 3));
Iterator<Integer> iter = arrayList.iterator();
int item = iter.next();
System.out.println(item);
arrayList.add(0, 4);
arrayList.add(1, 5);
for (int i = 0; i < Integer.MAX_VALUE; ++i) {
if ((i & 16777215) == 0) {
System.out.println(i);
}
arrayList.add(0, 3);
arrayList.remove(0);
}
iter.next();
System.out.println(item);
}
}
ArrayList<>, как и у итератора, хранится счетчик числа модификаций, при каждом изменении он увеличивается. Если счетчики не совпадают, то кидается исключение. Беда в том, что этот счетчик имеет тип int, поэтому его нетрудно переполнить. Чем, собственно, и занимается написанный выше код.