ConcurrentModificationException возникает в том случае, когда коллекция изменяется во время итерации. Чтобы избежать этой ошибки, можно использовать следующие методы:
Использовать итератор для удаления элементов из коллекции: при переборе коллекции используйте итератор и вызывайте метод remove() у итератора вместо метода remove() у коллекции. Таким образом, вы избегаете изменения коллекции во время её перебора, что приводит к возникновению исключения.
Создать копию коллекции перед перебором: создайте копию коллекции и перебирайте ее вместо оригинальной коллекции. Это позволяет избежать изменения оригинальной коллекции во время её перебора.
Использовать синхронизацию: синхронизация предотвращает одновременный доступ к коллекции из разных потоков, что может привести к изменению коллекции во время её перебора.
- Пример 1 - использование итератора для удаления элементов из коллекции:
List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
if (element.equals("two")) {
iterator.remove(); // безопасное удаление элемента "two" }
}
- Пример 2 - создание копии коллекции перед перебором:
List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
List<String> copy = new ArrayList<>(list);
for (String element : copy) {
if (element.equals("two")) {
list.remove(element); // безопасное удаление элемента "two" }
}
- Пример 3 - использование синхронизации:
List<String> list = Collections.synchronizedList(new ArrayList<>());
synchronized (list) {
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
if (element.equals("two")) {
iterator.remove(); // безопасное удаление элемента "two" }
}
}
В общем, при переборе коллекций необходимо убедиться, что коллекция не изменяется во время её перебора, и использовать способы избежать этой ошибки.
1606 вопрос-ответ по Java: https://github.com/DEBAGanov/interview_questions
Tелеграмм канал: https://t.me/DEBAGanov
Мое резюме: https://github.com/DEBAGanov