关于在list循环的过程中进行删除的处理

最近在处理list循环操作的时候遇到了Java ConcurrentModificationException异常,下面介绍一下这个异常产生的原因,以及如何处理该异常。

原因

对Vector、ArrayList在迭代的时候如果同时对其进行修改

解决办法

以下四种方式可以实现遍历list删除某些特征元素

方式:

方法1、普通for循环 遍历List,删List除自身 特征条目;
缺点:不会抛异常 但结果 未必正确 由于list.size()在变动 根据脚标删除的未必是 特征元素;

方法2、高级for循环 遍历List,删除List自身 特定条目;
缺点:会抛异常 :java.util.ConcurrentModificationException;

方法3、引入参考List,for循环遍历删除原List 特定条目;
可实现,不抛出异常。

方法4、利用iterator 遍历删除List特定条目
可实现,不抛出异常。

下面给出这四种方法的实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// 1.利用普通for循环进行删除操作
for (int i = 0; i < list.size(); i++)
{
if (list.get(i).getName().equals("A"))
{
list.remove(list.get(i));
}
}

// 2.高级for循环会产生异常
for (Bean item : list)
{
if (item.getName().equals("A"))
{
list.remove(item);
}
}

// 3.通过引入一个参考list,正常
List<bean> referenceList = new ArrayList<bean>();
referenceList.addAll(list);

for (int i = 0; i < referenceList.size(); i++)
{
if (referenceList.get(i).getName().equals("A"))
{
list.remove(referenceList.get(i));
}
}

// 4.通过list.iterator();方法拿到iterator对象 调用iterator.remove();
Iterator<bean> it = list.iterator();
while (it.hasNext())
{
Bean student = it.next();
if (student.getName().equals("A"))
it.remove();
}

推荐文章