L'itération sur une Collection, en évitant ConcurrentModificationException lors de la suppression d'objets dans une boucle

Nous savons tous que vous ne pouvez pas faire ceci:

for (Object i : l) {
    if (condition(i)) {
        l.remove(i);
    }
}

ConcurrentModificationException etc... ce qui, apparemment, fonctionne parfois, mais pas toujours. Voici un code spécifique:

public static void main(String[] args) {
    Collection<Integer> l = new ArrayList<>();

    for (int i = 0; i < 10; ++i) {
        l.add(4);
        l.add(5);
        l.add(6);
    }

    for (int i : l) {
        if (i == 5) {
            l.remove(i);
        }
    }

    System.out.println(l);
}

Cela, bien sûr, les résultats dans:

Exception in thread "main" java.util.ConcurrentModificationException

... même si plusieurs threads ne sont pas... de toute façon.

Quelle est la meilleure solution à ce problème? Comment puis-je supprimer un élément de la collection dans une boucle sans jeter cette exception?

Je suis aussi à l'aide d'un arbitraire Collection ici, n'est pas nécessairement une ArrayList, de sorte que vous ne pouvez pas compter sur get.

InformationsquelleAutor Claudiu | 2008-10-21