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