Это не «абсолютно необходимо», но помогает предотвратить ряд потенциальных ошибок, как в однопоточном, так и многопоточном коде.Предположим, например, что вы перебираете набор и добавляете или удаляете элемент - как должен это обрабатывать итератор?Нет явно правильного поведения (вы можете захотеть, чтобы оно появилось позже в итерации, а может и нет).
Чтобы избежать CME, вы, как правило, хотите использовать две отдельные коллекции - одну, которую вы повторяете итот, который вы мутируете.Это также часто приводит к более чистому коду, который легче рассуждать.В конкретном случае списков вы можете перебирать индексы (for (int i = 0; i < list.size(); i++)
), но вы должны быть осторожны с тем, как i
изменяется при изменении списка, чтобы не пропустить или не выполнить двойную итерацию по элементу.