Найти в Дзене
DEBAGanov

Java 820. Что делать, чтобы не возникло исключение ConcurrentModificationException?

Чтобы избежать исключения ConcurrentModificationException в Java, необходимо использовать правильный подход при итерировании коллекций. Исключение возникает, когда коллекция изменяется во время итерации. Для этого есть несколько вариантов решения:

  • Использовать итератор вместо цикла for-each. Итератор позволяет удалять элементы коллекции без возникновения исключения:
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (item.equals("somevalue")) {
iterator.remove();
}
}

  • Использовать копию коллекции для итерации, если изменения необходимы только в оригинальной коллекции:
List<String> copyList = new ArrayList<>(originalList);
for (String item : copyList) {
if (item.equals("somevalue")) {
originalList.remove(item);
}
}

  • Использовать конкурентные коллекции, такие как ConcurrentLinkedQueue или ConcurrentHashMap, которые позволяют изменять коллекцию без блокировки ее состояния:
ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();
queue.add("value1");
queue.add("value2");
for (String item : queue) {
if (item.equals("value1")) {
queue.remove(item);
}
}

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

1606 вопрос-ответ по Java: https://github.com/DEBAGanov/interview_questions

Tелеграмм канал: https://t.me/DEBAGanov

Мое резюме: https://github.com/DEBAGanov