在迭代期間修改集合:綜合指南
要在迭代期間有效修改集合以避免 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中文網其他相關文章!