Интерфейсы Collection и Iterator предоставляют разные методы remove(), каждый подходит для конкретных ситуаций. Понимать, когда использовать каждый из них, критически важно, чтобы избежать runtime-исключений.
Интерфейс Collection предлагает два подхода к удалению:
remove(Object o) — удаляет конкретный объект из коллекцииremove(int index) — доступен в интерфейсе List, удаляет объект в указанной позицииЭти методы предназначены для использования когда никакая итерация не выполняется.
Интерфейс Iterator предоставляет remove() для удаления текущего элемента во время обхода. Этот метод безопасно изменяет коллекцию пока итератор активно проходит по ней.
Основное различие — когда каждый метод можно безопасно использовать:
| Метод | Безопасен во время итерации | Когда использовать |
|---|---|---|
Collection remove() | Нет | Изменение коллекции до или после итерации |
Iterator remove() | Да | Удаление элементов во время активной итерации |
Использование метода remove() из Collection во время итерации бросит ConcurrentModificationException. Это происходит потому, что изменение структуры коллекции, пока итератор проходит по ней, нарушает контракт итератора.
Всегда используй метод remove() из Iterator, когда нужно удалять элементы во время обхода коллекции. Это гарантирует безопасное изменение и предотвратит неожиданные исключения.
// Правильный подход
Iterator<String> iterator = collection.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
if (someCondition) {
iterator.remove(); // Безопасно
}
}
Вызов Collection.remove(Object o) во время итерации по этой коллекции выбросит ConcurrentModificationException.
Новый — ещё не проверен сообществом
Вы