для сравнения циклов по сравнению с расширенным для цикла в исключении одновременной модификации - PullRequest
0 голосов
/ 10 января 2019

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

import java.util.ArrayList;
import java.util.List;

public class ConcurrentModificationExceptionExample {

    public static void main(String args[]) {
        List<String> myList = new ArrayList<String>();

        myList.add("1");
        myList.add("2");
        myList.add("3");
        myList.add("4");
        myList.add("5");

        // enhanced for loop
/*     for(String s:myList){
         if(s.equals("1")){
             myList.remove("1");
         }
     }*/
// normal for loop
        for(int i = 0; i<myList.size(); i++){
            if(myList.get(i).equals("1")){
                myList.remove("1");
            }
        }

        System.out.println(myList);


    }
}

для тестирования // улучшено для цикла, можно не комментировать

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Обозначение цикла

for (String s: myList) {
    ...
}

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

При использовании

for (int i = 0; i < myList.size(); i++) {
    ...
}

и доступ к коллекции с помощью

myList.get(i)

Итератор не создан, и, следовательно, нет шансов для исключения.

0 голосов
/ 10 января 2019

Это потому, что в вашем коде "Normal for loop" нет Iterator. Вместо этого вы получаете доступ к элементам индивидуально с помощью get.

...