iterator并发修改异常
并发修改异常
在用迭代器遍历容器的时候,试图去修改容器中的元素,可能会引起并发修改异常(遍历的时候,相当于一个指针从0索引开始移动,当试图修改某个数据时,系统无法去操作这个指针)
// ConcurrentModificationException
产生原因
迭代器是依赖于集合而存在的,在判断成功之后,集合当中增加了新的元素,而迭代器却不知道,所以就报错了,这个就叫并发修改异常。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListIteratorDemo2 {
public static void main(String[] args) {
//创建集合对象
List list = new ArrayList();
//添加对象
list.add("hello");
list.add("world");
list.add("java");
//迭代器遍历
Iterator it = list.iterator();
while(it.hasNext()){
String string = (String) it.next();
//ConcurrentModificationException
if(string.equals("world")){
list.add("javaee");
}
}
System.out.println("list:"+list);
}
}
所报的错误:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at cn.hhy.test_04.ListIteratorDemo2.main(ListIteratorDemo2.java:23)
也就是迭代器遍历元素的时候,集合不能进行修改元素。
解决方案
- 1.使用listIterator迭代器迭代元素,迭代器修改元素:元素跟在刚才迭代元素之后
ListIterator lit = list.listIterator();
while(lit.hasNext()){
String string = (String) lit.next();
//ConcurrentModificationException
if(string.equals("world")){
lit.add("javaee");
}
}
- 2.集合遍历元素,集合修改元素(普通的for):元素跟在集合最后一个元素之后。
for(int i=0;i<list.size();i++){
String s = (String)list.get(i);
if(s.equals("world")){
list.add("javaee");
}
}