В Java часто возникает типичная проблема, когда приходится удалять элементы из коллекции во время ее итерации. Например:
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("C++");
for (String language : list) {
if (language.equals("Python")) {
list.remove(language);
}
}
В этом коде происходит попытка удалить элемент из списка во время его обхода. Это вызывает ConcurrentModificationException, несмотря на то, что операции производятся в одном потоке.
Существуют различные способы решения этой проблемы.
Использование итератора
Один из самых надежных и гибких способов — использование итератора. Итераторы предоставляют метод remove(), который безопасно удаляет текущий элемент из коллекции.
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("C++");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String language = iterator.next();
if (language.equals("Python")) {
iterator.remove();
}
}
Использование метода removeIf()
Еще один удобный метод для удаления элементов из коллекции — removeIf(). Этот метод принимает предикат (условие), и удаляет все элементы, которые его удовлетворяют.
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("C++");
list.removeIf(language -> language.equals("Python"));
Оба этих способа позволяют избежать ConcurrentModificationException и безопасно удалять элементы из коллекции во время ее итерации.
Перейти в телеграм, чтобы получить результаты теста



Забрать
Добавить комментарий