ConcurrentModificationException
异常Log:
产生异常的代码:
ArrayList al = new ArrayList();
// 集合操作
al.add("java01");
al.add("java02");
al.add("java03");
// 迭代器操作
Iterator it = al.iterator();
while(it.hasNext()) {
// java.util.ConcurrentModificationException
Object obj = it.next();
if (obj.equals("java02")) {
// 集合操作
al.remove("java02");
}
}
原因:
操作元素的方法有两种:1. 集合 2. 迭代器
上面while循环的代码中同时使用了两种方法并发操作元素(使用Iterator查询元素,使用ArrayList删除元素),会产生安全隐患。Iterator不允许这样操作。
解决办法:
只用其中一种方式操作。
if (obj.equals("java02")) {
it.remove();
}
如果想要其他的操作如添加、修改等,就需要使用其子接口,即ListIterator。 该接口只能通过List集合的listIterator()获取。
ArrayList al = new ArrayList();
al.add("java01");
al.add("java02");
al.add("java03");
ListIterator li = al.listIterator();
while(li.hasNext()) {
Object obj = li.next();
if (obj.equals("java02")) {
li.add("java09");
}
}
System.out.println("hasNext(): " + li.hasNext());
System.out.println("hasPrevious(): " + li.hasPrevious());