ホームページ >Java >&#&チュートリアル >Java で反復中にコレクションを安全に変更するにはどうすればよいですか?
反復中のコレクションの変更: 総合ガイド
ConcurrentModificationException のようなエラーを回避するために反復中にコレクションを効果的に変更するには、考慮すべき戦略がいくつかあります。 :
集めてRemove
このメソッドには、拡張 for ループ中に削除されるオブジェクトを収集し、反復の完了後にそれらを削除することが含まれます。この手法は、削除が主な目的であるシナリオで特に役立ちます。
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);
ListIterator の使用
ListIterator は、反復中の項目の削除と追加の両方をサポートします。これにより、リストを変更するときにこれが適切な選択肢になります:
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 では、コレクション変更のための追加メソッドが導入されました:
List<Book> books = new ArrayList<>(); ISBN isbn = new ISBN("0-201-63361-2"); books.removeIf(book -> book.getIsbn().equals(isbn));
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());
サブリストまたはサブセット
ソートされたリストの場合、サブリストを使用して連続した要素を効率的に削除できます。
List<Book> books = new ArrayList<>(); books.subList(0, 5).clear();
考慮事項
変更の選択方法は、特定のシナリオとコレクションの種類によって異なります。以下に重要な考慮事項をいくつか示します。
以上がJava で反復中にコレクションを安全に変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。