Почему я не получаю ConcurrentModificationException при удалении элемента из ArrayList во время итерации

Я использую следующий код для циклического просмотра списка массивов, а затем удаляю один элемент из списка массивов.

Здесь я ожидаю ConcurrentModificationException. Но не получил это исключение. особенно когда вы проверяете условие с (n-1)-м элементом. Помогите пожалуйста мне. Ниже мой код.

    ArrayList<Integer> arrayList = new ArrayList<Integer>();

    for (int i = 1; i <= 10; i++) {
        arrayList.add(5 * i);
    }
    System.out.println(arrayList);

    Iterator<Integer> iterator = arrayList.iterator();
    while (iterator.hasNext()) {
        Integer temp = iterator.next();
        if (temp == 45) {
            /**
             * temp == 40 (then i'm getting *ConcurrentModificationException) why not i'm
             * getting ConcurrentModificationException if (temp == 45)
             */
            arrayList.remove(1);
        }
    }
    System.out.println(arrayList);

Заранее спасибо


person Naveen    schedule 10.10.2019    source источник
comment
Это не надежно. Исключение выдается, если модификация замечена, это не всегда заметно.   -  person Kayaman    schedule 10.10.2019
comment
Если я изменю 45 на 25, возникнет исключение.   -  person Sweeper    schedule 10.10.2019
comment
вместо этого используйте iterator.remove();, чтобы избавиться от исключения.   -  person Another coder    schedule 10.10.2019


Ответы (1)


Реализация делает все возможное, чтобы обнаружить одновременную модификацию, но бывают случаи, когда это не удается.

Реализация Iterator, возвращенная для Iterator проверки ArrayList на одновременную модификацию в next() и remove(), но не в hasNext(), чья логика такова:

public boolean hasNext() {
    return cursor != size;
}

Поскольку вы удалили элемент, когда курсор Iterator был на элементе перед последним элементом, удаление приводит к тому, что hasNext() возвращает false (поскольку size становится равным cursor после удаления), что завершает ваш цикл без создания исключения.

person Eran    schedule 10.10.2019