问题重现:
package ArrayListDemo;
import java.util.ArrayList;
import java.util.Iterator;
public class ArrayListDemo {
/**
* @param args
*/
public static void main(String[] args) {
ArrayList ls = new ArrayList();
ls.add("hello");
ls.add("world");
ls.add("java");
Iterator it = ls.iterator();
while(it.hasNext()){
String s = (String)it.next();
if(s.equals("world")){
ls.add("hello");
}
}
}
}
如上所述,在iterator遍历的ArrayList的同时,向集合中添加元素 hello ,会抛出并发修改异常ConcurrentModificationException,是因为迭代器 it 和 集合对象ls 同时操作 arrayLis
t。
解决方案:
从字面意思我们可以猜到,既然是并发修改异常,肯定是发生了并发修改,那么我们可以避免并发修改,就可以避免异常了。
package ArrayListDemo;
import java.util.ArrayList;
import java.util.ListIterator;
public class ArrayListDemo {
/**
* @param args
*/
public static void main(String[] args) {
ArrayList ls = new ArrayList();
ls.add("hello");
ls.add("world");
ls.add("java");
// Iterator it = ls.iterator();
// while(it.hasNext()){
// String s = (String)it.next();
// if(s.equals("world")){
// ls.add("hello");
// }
// }
// 解决方案1
// 迭代器遍历,迭代器修改
// ListIterator lit = ls.listIterator();
// while(lit.hasNext()){
// String s = (String)lit.next();
// if(s.equals("world")){
// lit.add("hello");
// }
//
// }
// System.out.println(ls.toString());
//[hello, world, hello, java] 添加成功
// 解决方案2
// 集合遍历,集合修改(普通for循环)
int len = ls.size();
for(int i = 0;i<len;i++){
if(ls.get(i).equals("world")){
ls.add("hello");
}
}
System.out.println(ls.toString());
// [hello, world, java, hello] 添加成功 但是元素在最后
}
}