首頁 >Java >java教程 >在 Java 中迭代時如何安全地修改集合?

在 Java 中迭代時如何安全地修改集合?

Patricia Arquette
Patricia Arquette原創
2024-12-09 22:45:15816瀏覽

How Can I Safely Modify Collections While Iterating in 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 引入了用於集合修改的附加方法:

  • removeIf:此方法從集合:
List<Book> books = new ArrayList<>();
ISBN isbn = new ISBN("0-201-63361-2");
books.removeIf(book -> book.getIsbn().equals(isbn));
  • Stream API:流API允許使用管道過濾和刪除元素:
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();

注意事項

修改方法的選擇取決於特定場景和集合類型。以下是一些關鍵注意事項:

  • 「收集和刪除」技術用途廣泛,適用於任何集合。
  • ListIterator 方法非常高效,但僅適用於具有支援實作的清單。
  • 迭代器方法支援刪除,但可能並不普遍可用。
  • JDK 8 方法提供高效率的過濾和刪除,但需要轉移到新集合。
  • 子清單允許批次刪除排序清單中的連續元素。

以上是在 Java 中迭代時如何安全地修改集合?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn