先看这样一段代码:
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
for (String temp : list) {
if("1".equals(temp)){
list.remove(temp);
}
}
这是对一个集合进行简单迭代,当集合中的某一个元素与“1”相等则移除该元素,程序运行正常;此时我们把“1”换成“2”:
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
for (String temp : list) {
if("2".equals(temp)){
list.remove(temp);
}
}
系统出现java.util.ConcurrentModificationException异常。某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection。通常在这些情况下,迭代的结果是不确定的。如果检测到这种行为,一些迭代器实现(包括 JRE 提供的所有通用 collection 实现)可能选择抛出此异常。执行该操作的迭代器称为快速失败 迭代器,因为迭代器很快就完全失败,而不会冒着在将来某个时间任意发生不确定行为的风险。这是JDK API对ConcurrentModificationException的举例说明。
产生的原因可参考http://blog.csdn.net/izard999/article/details/6708738。
若要避免此异常可使用Iterator进行操作:
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
Iterator<String> it = a.iterator();
while(it.hasNext()){
String temp = it.next();
if("2".equals(temp)){
it.remove();
}
}