遍歷集合時出現異常:java.util.ConcurrentModificationException的處理方案
阿新 • • 發佈:2019-02-09
0.出現異常的原因:集合在迭代過程中對其中的元素進行修改操作。
以下是解決方法
1.java遍歷Map時,對其元素進行刪除
- package net.nie.test;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.Map;
- public class HashMapTest {
- private static Map<Integer, String> map=new HashMap<Integer,String>();
- /** 1.HashMap 類對映不保證順序;某些對映可明確保證其順序: TreeMap 類
- * 2.在遍歷Map過程中,不能用map.put(key,newVal),map.remove(key)來修改和刪除元素,
- * 會引發 併發修改異常,可以通過迭代器的remove():
- * 從迭代器指向的 collection 中移除當前迭代元素
- * 來達到刪除訪問中的元素的目的。
- * */
- public static void main(String[] args) {
- map.put(1,"one");
- map.put(2,"two");
- map.put(3,"three"
- map.put(4,"four");
- map.put(5,"five");
- map.put(6,"six");
- map.put(7,"seven");
- map.put(8,"eight");
- map.put(5,"five");
- map.put(9,"nine");
- map.put(10,"ten");
- Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();
- while(it.hasNext()){
- Map.Entry<Integer, String> entry=it.next();
- int key=entry.getKey();
- if(key%2==1){
- System.out.println("delete this: "+key+" = "+key);
- //map.put(key, "奇數"); //ConcurrentModificationException
- //map.remove(key); //ConcurrentModificationException
- it.remove(); //OK
- }
- }
- //遍歷當前的map;這種新的for迴圈無法修改map內容,因為不通過迭代器。
- System.out.println("-------\n\t最終的map的元素遍歷:");
- for(Map.Entry<Integer, String> entry:map.entrySet()){
- int k=entry.getKey();
- String v=entry.getValue();
- System.out.println(k+" = "+v);
- }
- }
- }
2.List對其中的元素遍歷時進行刪除操作
1 public void test3() { 2 ArrayList<Integer> arrayList = new ArrayList<>(); 3 for (int i = 0; i < 20; i++) { 4 arrayList.add(Integer.valueOf(i)); 5 } 6 7 ListIterator<Integer> iterator = arrayList.listIterator(); 8 while (iterator.hasNext()) { 9 Integer integer = iterator.next(); 10 if (integer.intValue() == 5) { 11 iterator.set(Integer.valueOf(6)); 12 iterator.remove(); 13 iterator.add(integer); 14 } 15 } 16 }