学习笔记,仅供参考,有错必纠
集合
并发修改异常产生的原因及解决方案
在这个博客中,我们用一个案例学习这个知识点。
- 举个例子
现在,我有一个集合,我想判断这个集合中是否有"Gui"这个元素,如果有我就再添加一个"Yang"。
package com.guiyang.object;
import java.util.List;
import java.util.ListIterator;
import java.util.ArrayList;
import java.util.Iterator;
@SuppressWarnings({ "rawtypes", "unchecked" })
public class Demo3_List {
public static void main(String[] args) {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("Gui");
list.add("e");
Iterator lit = list.iterator();
while(lit.hasNext()) {
String string = (String)lit.next();
System.out.println(string);
if ("Gui".equals(string)) {
list.add("Yang");
}
}
System.out.println(list);
}
}
报错信息:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at com.guiyang.object.Demo3_List.main(Demo3_List.java:24)
我们看到,java抛出了一个ConcurrentModificationException异常(遍历的同时进行修改)
ConcurrentModificationException
ConcurrentModificationException异常,中文名为并发修改异常。当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。 例如,某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection。通常在这些情况下,迭代的结果是不确定的。如果检测到这种行为,一些迭代器实现(包括 JRE 提供的所有通用 collection 实现)可能选择抛出此异常。
解决方案
利用List集合特有的迭代方式ListIterator的特有功能add进行元素的添加。
- ListIterator方法
ListIterator<E> listIterator()
返回此列表元素的列表迭代器(按适当顺序)
- 举个例子
package com.guiyang.object;
import java.util.List;
import java.util.ListIterator;
import java.util.ArrayList;
import java.util.Iterator;
@SuppressWarnings({ "rawtypes", "unchecked" })
public class Demo3_List {
public static void main(String[] args) {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("Gui");
list.add("e");
ListIterator lit = list.listIterator();
while(lit.hasNext()) {
String string = (String)lit.next();
System.out.println(string);
if ("Gui".equals(string)) {
lit.add("Yang");
}
}
System.out.println(list);
}
}
输出:
a
b
c
d
Gui
e
[a, b, c, d, Gui, Yang, e]