首页 >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