Как изменить коллекцию при повторении с использованием for-each цикла без ConcurrentModificationException?

Если я модифицирую коллекцию, итерации по ней, используя цикл for-each, она дает ConcurrentModificationException . Есть ли обходной путь?

    Используйте Iterator#remove .

    Это единственный безопасный способ изменения коллекции во время итерации. Для получения дополнительной информации см . Учебник по интерфейсу коллекции .

    Если вам нужна возможность добавлять элементы во время итерации, используйте ListIterator .

    Одна работа заключается в том, чтобы сохранить ваши изменения и добавить / удалить их после цикла.

    Например:

     List toRemove = new LinkedList(); for(Item it:items){ if(remove){ toRemove.add(it); } } items.removeAll(toRemove); 

    Второй способ обхода – использовать class коллекции, iteratorы которого не будут давать исключение. Например, ConcurrentLinkedQueue , ConcurrentHashMap и так далее.

    Они избегают необходимости исключать исключения, предоставляя более слабые модели согласованности для iteratorов. (Конечно, вам нужно понять эти модели и решить, подходят ли они для вашего приложения.)

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

    Если вы просто хотите удалить элемент из коллекции, вы можете использовать Iterator вместо Iterable.

    В противном случае вы можете не перебирать исходную коллекцию, а сначала сделать копию списка. Например, если ваша коллекция является списком, вы можете создать новый ArrayList (originaList) и перебрать его. Модификация должна быть внесена в исходный список.

    Другая альтернатива, которая может быть лучше для вашего случая использования, не должна использоваться для каждого, кроме традиционного для.

    Давайте будем гением компьютера.