學習筆記,僅供參考,有錯必糾
集合
併發修改異常產生的原因及解決方案
在這個博客中,我們用一個案例學習這個知識點。
- 舉個例子
現在,我有一個集合,我想判斷這個集合中是否有"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]