Почему Hashmap создает исключение ConcurrentModificationException, если размер Hashmap не изменяется - PullRequest
0 голосов
/ 29 апреля 2018

Я изучаю hashmap, я могу знать, что когда карта повторяется. hashmap внутренне отслеживает размер hashmap и, если есть какие-либо изменения в размере, hashmap генерирует исключение ConcurrentModificationException.

Идем вперед с той же точки зрения. Посмотрите на этот кусок кода

    HashMap<String, String> myMap = new HashMap<>();
    myMap.put("1", "1");
    myMap.put("2", "2");
    myMap.put("3", "3");
    myMap.put("4", "4");

            System.out.println("HashMap before iterator size before : " +myMap.size());
    try {
        for(String key : myMap.keySet()){
                myMap.remove("3");
                myMap.remove("4");
                myMap.put("5", "new8"); 
                myMap.put("6", "new9");
        }
    } catch(ConcurrentModificationException exception) {
        System.out.println("HashMap before iterator size after : " +myMap.size());
    }
    System.out.println("HashMap before iterator fourth : "+myMap);

Выход такой же:

HashMap before iterator size before 4
HashMap before iterator size after  4
HashMap before iterator fourth : {1=1, 2=2, 5=new8, 6=new9}

Почему в этом случае выдает ошибку hashmap?

1 Ответ

0 голосов
/ 29 апреля 2018

hashmap внутренне отслеживает размер hashmap и, если есть какие-либо изменения в размере, hashmap создает ConcurrentModificationException

Это неправильно. Для принятия решения о том, выбрасывать ConcurrentModificationException, HashMap отслеживает количество модификаций, а не размер Map. Добавление двух записей и удаление двух записей увеличивает количество модификаций на 4. Отсюда исключение.

В Javadoc говорится:

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

Любые операции put или remove, которые фактически добавляют или удаляют запись, вызывают структурную модификацию Map, поэтому ваш итератор над myMap.keySet() выдаст ConcurrentModificationException.

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