Sobes.tech
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);
    }
}