Почему я не получаю исключение одновременной модификации во время обновления элемента коллекции?

Я только что прочитал, что исключение одновременной модификации произойдет, если мы добавим, удалим или обновим коллекцию после вызова метода итератора.

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

например, приведенный ниже код относится к реализации массива

public E set(int index, E element) {
    rangeCheck(index);

    E oldValue = elementData(index);
    elementData[index] = element;
    return oldValue;
}

мы не обновляем переменную "modcount", которая фактически используется для проверки параллельных модификаций.

я также пробовал с моим пользовательским кодом:

public static void main(String[] args) {
    ArrayList l= new ArrayList();
    l.add("string");
    l.add(3);
    Iterator it=l.iterator();
    Object o=it.next();
    l.set(0, "element");
    l.remove(o);
    //l.add(7);
    //it.next();

    System.out.println(it.next());
    System.out.println(l.get(0));
    int i;
    System.out.println(j+" "+j);
}

это также не вызывает исключение одновременной модификации.

могу я узнать почему?


person amarnath harish    schedule 18.03.2018    source источник
comment
В какой точке/строке вы исключаете получение ConcurrentModificationException ?   -  person Amit Bera    schedule 18.03.2018
comment
Не совсем актуально, но убедитесь, что вы правильно используете дженерики, а не необработанные типы.   -  person Boris the Spider    schedule 18.03.2018
comment
если вы не понимаете мой вопрос, я не спрашиваю, почему я получаю исключение, я спрашиваю, почему я не @HovercraftFullOfEels   -  person amarnath harish    schedule 18.03.2018
comment
@AmitBera строка, в которой я использую набор методов из коллекции.   -  person amarnath harish    schedule 18.03.2018
comment
Вопрос открыт снова и мои извинения. Код отформатирован для удобства чтения   -  person Hovercraft Full Of Eels    schedule 18.03.2018
comment
@HovercraftFullOfEels, пожалуйста, правильно поймите вопрос, прежде чем помечать его как дубликат.   -  person amarnath harish    schedule 18.03.2018
comment
Я только что прочитал, что исключение параллельной модификации возникнет, если мы добавим, удалим или обновим коллекцию после вызова метода итератора. Где вы это прочитали?   -  person lexicore    schedule 18.03.2018
comment
Не совсем это не работало одновременно.   -  person Roman C    schedule 18.03.2018


Ответы (1)


почему обновление должно вызывать одновременную модификацию?

Если под «обновлением» вы подразумеваете вызов метода set, это не приведет к параллельной модификации. Установка значения элемента в List не является структурной модификацией и, следовательно, не вызывает ConcurrentModificationException при выполнении во время итерации.

Цитаты из ArrayList Javadoc:

Структурная модификация — это любая операция, которая добавляет или удаляет один или несколько элементов или явно изменяет размер резервного массива; простая установка значения элемента не является структурной модификацией...

Итераторы, возвращаемые методами iterator и listIterator этого класса, являются отказоустойчивыми: если список структурно изменен в любое время после создания итератора любым способом, кроме как с помощью собственных методов удаления или добавления итератора, итератор выдаст исключение ConcurrentModificationException. Таким образом, перед лицом одновременной модификации итератор быстро и чисто дает сбой, а не рискует произвольным, недетерминированным поведением в неопределенное время в будущем.

person Eran    schedule 18.03.2018
comment
спасибо за ответ, документ, на который я ссылался, просто указывает. Например, если поток изменяет коллекцию напрямую, когда он выполняет итерацию по коллекции с отказоустойчивым итератором, итератор выдаст это исключение. из docs.oracle.com/javase/7/docs /api/java/util/. он ничего не говорит о разрешенном типе модификации. - person amarnath harish; 18.03.2018