List遍历时java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkFo
时间: 2025-02-14 16:15:06 浏览: 43
### 解决方案
为了避免在遍历 `List` 集合时发生 `java.util.ConcurrentModificationException` 异常,可以采用以下几种方法:
#### 使用迭代器的 remove 方法
当使用迭代器遍历列表并需要移除元素时,应该始终使用迭代器自己的 `remove()` 方法而不是集合本身的 `remove()` 或其他修改结构的方法。
```java
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Example {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
if ("B".equals(element)) {
iterator.remove(); // 安全地移除元素
}
}
System.out.println(list);
}
}
```
这种方法确保了即使在遍历过程中进行了删除操作也不会触发异常[^2]。
#### 利用并发安全的数据结构
对于多线程环境下的访问需求,可以选择使用线程安全版本的集合类来代替普通的 `ArrayList` 或者 `LinkedList`。例如 `CopyOnWriteArrayList` 可以有效防止此类问题的发生因为它会在每次写入前复制整个数组从而避免了结构性变化带来的影响。
```java
import java.util.concurrent.CopyOnWriteArrayList;
// ...其余代码同上...
List<String> threadSafeList = new CopyOnWriteArrayList<>(list);
for (String item : threadSafeList){
if(someCondition(item)){
threadSafeList.remove(item);
}
}
System.out.println(threadSafeList);
```
这里需要注意的是虽然这种方式解决了异常的问题但它可能会带来性能上的开销因为每一次更新都需要拷贝全部数据[^5]。
#### 创建临时副本进行处理
另一种策略是在开始之前先创建原始列表的一个快照,在此基础上做任何必要的改动而不会干扰到正在被读取的那个实例。
```java
import java.util.Arrays;
import java.util.List;
// ...其余代码同上...
List<String> originalList = Arrays.asList("A", "B", "C");
List<String> tempList = new ArrayList<>(originalList);
tempList.forEach(e -> {
if (!e.equals("B")) {
// 对原列表的操作基于条件判断后的逻辑
originalList.removeIf(x->x.equals(e));
}
});
System.out.println(originalList);
```
这种做法能够很好地绕过因直接操纵源容器而导致的竞争状态[^1]。
阅读全文
相关推荐


















