面试题:简述 如何边遍历边移除 Collection 中的元素 ?

在Java中,直接尝试在遍历Collection的同时对其进行结构上的修改(如添加或删除元素)会导致ConcurrentModificationException异常。这是因为大多数集合类都实现了“快速失败”机制来检测并发修改。然而,有几种安全的方法可以在遍历集合的同时移除元素:

方法1:使用 Iterator 的 remove 方法

这是最推荐的方式。通过调用Iterator对象的remove()方法,可以在迭代过程中安全地从底层集合中移除元素。这种方法不会抛出ConcurrentModificationException

示例代码:

import java.util.*;

public class IteratorRemoveExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));
        Iterator<String> it = list.iterator();

        while(it.hasNext()) {
            String element = it.next();
            if (element.equals("B")) {
                it.remove(); // 安全地移除元素"B"
            }
        }

        System.out.println(list); // 输出: [A, C, D]
    }
}

方法2:使用 Java 8 Stream API 和 filter 操作

如果你使用的是Java 8及以上版本,可以利用Stream API提供的过滤功能来创建一个新的流,并排除不需要的元素。不过需要注意的是,这实际上并不会修改原始集合,而是生成一个新集合。

示例代码:

import java.util.*;
import java.util.stream.Collectors;

public class StreamFilterExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));
        list = list.stream()
                   .filter(element -> !element.equals("B"))
                   .collect(Collectors.toList());

        System.out.println(list); // 输出: [A, C, D]
    }
}

总结

  • 在遍历Collection时,最安全且推荐的做法是使用Iterator及其remove()方法来移除元素。这样做不仅避免了ConcurrentModificationException异常,而且效率也比较高。
  • 如果你使用的是Java 8或更高版本,Stream API提供了一种更加函数式编程的方式来处理数据,但请注意它不直接修改原始集合,而是返回一个新集合。
  • 尽量避免在增强for循环或者普通的for循环中手动对集合进行增删操作,因为这很容易导致ConcurrentModificationException异常。正确选择合适的工具和方法对于编写高效、无误的代码至关重要。
THE END
点赞7 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容