Middle
Como se comportará um iterador instanciado para uma coleção se chamar o método collection.remove()?
sobes.tech IA
Resposta da IA
Chamar collection.remove() durante a iteração com um iterador instanciado pode levar a uma ConcurrentModificationException.
Isto acontece porque o iterador normalmente não conhece as alterações feitas na coleção base diretamente de fora do iterador. O iterador mantém um estado interno (por exemplo, o índice do elemento atual), que se torna inválido se a coleção for modificada fora dos métodos do próprio iterador (iterator.remove()).
Algumas implementações de coleções podem ser "fail-fast" e lançar especificamente ConcurrentModificationException ao detectar tais alterações, para evitar comportamentos imprevisíveis.
A única maneira segura de modificar a coleção durante a iteração é usar o método iterator.remove().
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorModificationExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
if ("B".equals(element)) {
// Isto causará uma ConcurrentModificationException
// list.remove(element);
// Forma segura de remover
iterator.remove();
}
}
System.out.println(list);
}
}