在实际生产过程中,碰到了一个概念中的异常,ConcurrentModificationException。
这个异常主要出现在集合的遍历中,对集合进行了add或者remove的操作;
以ArrayList为例子,当在forEach的时候,对list本身进行add或者remove的操作,查看ArrayList的源码,相当于是移动了指针;点击查看
以HashMap为例,集合的修改有一个modCount,遍历的时候底层代码会去校验这个modCount,如果在遍历的过程中集合进行了修改操作,那么这个modCount就和初始的不一致,抛出ConcurrentModificationException异常;点击查看这里也关系到了一个概念—集合的快速失败 fail-fast机制;
那么如何避免呢?
方法一: 通过集合的普通遍历方式(并非forEach方式,因为foreach本身也是一种迭代)
for(i=0;i<size();i++)
方法二: 通过迭代器进行迭代删除:
List<String> listStr = new ArrayList();
listStr.add("aaacc");
listStr.add("bbbcc");
Iterator<String> lista = listStr .iterator();
while (lista .hasNext()){
String t = lista .next();
if (t.length() == 3) {
lista .remove();
continue;
}
}
这里引申一下“如何跳出本次循环进行下一次 和 如何跳出整个循环体”?
continue break return;
- continue: 跳出本次循环,直接进行下一次循环;
- break 是结束整个循环过程;不再进行下一个判断是不是符合条件;“中断退出当前循环”
- return return 和循环没关系,就是跳出当前函数,不用再循环中;