在實際生產過程中,碰到了一個概念中的異常,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 和循環沒關係,就是跳出當前函數,不用再循環中;