ConcurrentModificationException не происходит при добавлении дублирующего элемента - PullRequest
0 голосов
/ 06 февраля 2019
Итератор

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

Map<String,String> myMap = new HashMap<String,String>();
    myMap.put("1", "1");
    myMap.put("2", "2");
    myMap.put("3", "3");
    Iterator<String> it1 = myMap.keySet().iterator();
    while(it1.hasNext()){
        String key = (String) it1.next();
        System.out.println("Map Value:"+myMap.get(key));
        if(key.equals("2")){
            myMap.put("1","4");
        }
    }

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вы перезаписываете запись карты, поэтому итератор работает, несмотря на это, поскольку проверка iterator() касается структурной модификации карты.
Добавьте новую запись, и она выдаст исключение myMap.put("4","4");.
Обратите внимание, что на самом деле поведение, которое вы заметили, является деталью реализации, и что даже если он работает, вы не должны рассматривать его как допустимый код.
Чтобы соответствовать спецификации API карты, вам не нужно менять картус объектом, на который ссылаются, когда вы используете итератор.

Map.keySet() действительно указывает:

Если карта изменяется во время выполнения итерации по набору (кроме как через собственную операцию удаления итератора), результаты итерации не определены

0 голосов
/ 06 февраля 2019

Поскольку вы обновляете существующее значение ключа в myMap, его размер не изменился, и вы не получаете ConcurrentModificationException.

Если вам интересно, как Iterator проверяет модификацию, ее реализациюприсутствует в классе AbstractList, где определена переменная int modCount.modCount предоставляет количество раз, когда размер списка был изменен.Значение modCount используется в каждом вызове next () для проверки любых изменений в функции checkForComodification ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...