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());