Возьмите этот код Java:
for (ContactsReduced curContact : allcontacts) {
..........
allcontacts.remove(curContact);
}
Я делаю на основе условия удаление, foreach пропустит следующий объект в порядке, и мы должны отступить (так или иначе)?
Этот код не работает с большинством коллекций - кроме нескольких коллекций, таких как в java.util.concurrent
, изменение коллекции во время итерации по ней не поддерживается.
Несколько вариантов:
iterator ()
в коллекции) вместо расширенного цикла for и вызвать iterator.remove ()
, чтобы удалить элемент Определенно не рекомендуется вмешиваться в коллекцию во время ее итерации. Я не уверен, позволяет ли это Java; это может вызвать исключение. Я знаю, что C # ...
Итератор завершится с ошибкой ConcurrentModificationException. Так устроен фреймворк коллекции.
Посмотрите раздел об итераторах в учебнике по интерфейсу коллекции
Используйте Iterator вместо конструкции for-each, когда вам нужно удалить текущий элемент. Конструкция for-each скрывает итератор, поэтому вы не можете вызвать remove. Поэтому конструкцию for-each нельзя использовать для фильтрации.
Обратите внимание, что Iterator.remove - единственный безопасный способ изменить коллекцию во время итерации
List<Integer> al = new ArrayList<Integer>();
for(int i=0;i<10;i++){
al.add(i);
}
for(Integer x:al){
al.remove(x);
System.out.println(al);
}
Вопрос интересный, поэтому я попробовал его в своей системе, и вот что я получил.
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
at java.util.AbstractList$Itr.next(Unknown Source)
at test.Main.main(Main.java:17)