Maison >Java >javaDidacticiel >Comment puis-je modifier en toute sécurité des collections lors d'une itération en Java ?

Comment puis-je modifier en toute sécurité des collections lors d'une itération en Java ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-09 22:45:15825parcourir

How Can I Safely Modify Collections While Iterating in Java?

Modification des collections pendant l'itération : un guide complet

Pour modifier efficacement les collections pendant l'itération afin d'éviter des erreurs telles que ConcurrentModificationException, il existe plusieurs stratégies à considérer :

Collecter et supprimer

Ceci La méthode consiste à collecter les objets à supprimer lors d'une boucle for améliorée, puis à les supprimer une fois l'itération terminée. Cette technique est particulièrement utile dans les scénarios où la suppression est l'objectif principal :

List<Book> books = new ArrayList<>();
ISBN isbn = new ISBN("0-201-63361-2");
List<Book> found = new ArrayList<>();

for (Book book : books) {
    if (book.getIsbn().equals(isbn)) {
        found.add(book);
    }
}

books.removeAll(found);

Utilisation de ListIterator

ListIterator prend en charge à la fois la suppression et l'ajout d'éléments au cours de l'itération. Cela en fait un choix approprié lors de la modification de listes :

List<Book> books = new ArrayList<>();
ISBN isbn = new ISBN("0-201-63361-2");
ListIterator<Book> iter = books.listIterator();

while (iter.hasNext()) {
    if (iter.next().getIsbn().equals(isbn)) {
        iter.remove();
    }
}

JDK >= 8

Java 8 introduit des méthodes supplémentaires pour la modification des collections :

  • removeIf : Cette méthode supprime les éléments correspondant à un prédicat spécifié du collection :
List<Book> books = new ArrayList<>();
ISBN isbn = new ISBN("0-201-63361-2");
books.removeIf(book -> book.getIsbn().equals(isbn));
  • API Stream : L'API stream permet de filtrer et de supprimer des éléments à l'aide de pipelines :
List<Book> books = new ArrayList<>();
ISBN isbn = new ISBN("0-201-63361-2");
List<Book> filtered = books.stream()
                           .filter(book -> book.getIsbn().equals(isbn))
                           .collect(Collectors.toList());

Sous-liste ou sous-ensemble

Pour les listes triées, la suppression d'éléments consécutifs peut être effectuée efficacement à l'aide de sous-listes :

List<Book> books = new ArrayList<>();
books.subList(0, 5).clear();

Considérations

Le choix de la méthode de modification dépend du scénario spécifique et du type de collection. Voici quelques considérations clés :

  • La technique « collecter et supprimer » est polyvalente et fonctionne avec n'importe quelle collection.
  • L'approche ListIterator est efficace mais applicable uniquement aux listes avec des implémentations prises en charge.
  • L'approche Iterator prend en charge la suppression mais peut ne pas être universellement disponible.
  • Les méthodes JDK 8 offrent un filtrage et une suppression efficaces, mais nécessitent un transfert vers une nouvelle collection.
  • Les sous-listes permettent la suppression groupée d'éléments consécutifs dans des listes triées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn