如何避免 ConcurrentModificationException 異常

在實際生產過程中,碰到了一個概念中的異常,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;

  1. continue: 跳出本次循環,直接進行下一次循環;
  2. break 是結束整個循環過程;不再進行下一個判斷是不是符合條件;“中斷退出當前循環”
  3. return return 和循環沒關係,就是跳出當前函數,不用再循環中;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章