使用Iterator的remove方法可安全删除元素,避免ConcurrentModificationException。

在Java中遍历集合的同时修改其元素,容易引发 ConcurrentModificationException 异常。这是因为大多数集合类(如 ArrayList、HashMap)采用“快速失败”(fail-fast)机制,在迭代过程中检测到结构被修改就会抛出异常。要安全地遍历并修改集合,需选择合适的方法。
这是最常见且推荐的方式,适用于删除元素的场景:
示例代码:
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String item = it.next();
if ("b".equals(item)) {
it.remove(); // 安全删除
}
}
如果需要在多线程或复杂操作中修改集合,可选用 java.util.concurrent 包中的线程安全集合:
立即学习“Java免费学习笔记(深入)”;
这些集合允许在遍历时进行修改,不会抛出 ConcurrentModificationException。
示例:
List<String> list = new CopyOnWriteArrayList<>
(Arrays.asList("a", "b", "c"));
for (String item : list) {
if ("b".equals(item)) {
list.remove(item); // 允许直接删除
}
}
若逻辑较复杂,或需要添加/替换元素,可分两步处理:
这种方法逻辑清晰,避免了边遍历边修改的风险。
示例:
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
List<String> toRemove = new ArrayList<>();
for (String item : list) {
if ("b".equals(item)) {
toRemove.add(item);
}
}
list.removeAll(toRemove);
Java 8 提供了更简洁的安全修改方式:
这些方法内部已处理并发问题,无需手动控制迭代器。
示例:
list.removeIf(item -> "b".equals(item)); list.replaceAll(String::toUpperCase);
基本上就这些。选择哪种方式取决于你的具体需求:单线程下优先用 Iterator 或 removeIf;多线程环境考虑 CopyOnWriteArrayList 等并发集合。关键是避免在普通集合遍历时直接调用集合自身的增删方法。
以上就是在Java中如何安全地遍历并修改集合的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号