如何避免在使用 Iterator 时发生 ConcurrentModificationException 异常,,Java的集合类中,当我
分享于 点击 41116 次 点评:12
如何避免在使用 Iterator 时发生 ConcurrentModificationException 异常,,Java的集合类中,当我
Java的集合类中,当我们使用迭代器来进行元素遍历的时候,如果集合元素发生变化,就会抛出异常ConcurrentModificationException.本代码告诉你如何避免该异常http://www.javacodegeeks.com/2011/05/avoid-concurrentmodificationexception.html
IteratorExample.java
import java.util.*;public class IteratorExample { public static void main(String args[]){ List<String> myList = new ArrayList<String>(); myList.add("1"); myList.add("2"); myList.add("3"); myList.add("4"); myList.add("5"); Iterator<String> it = myList.iterator(); while(it.hasNext()){ String value = it.next(); System.out.println("List Value:"+value); if(value.equals("3")) myList.remove(value); } Map<String,String> myMap = new HashMap<String,String>(); myMap.put("1", "1"); myMap.put("2", "2"); myMap.put("3", "3"); Iterator<String> it1 = myMap.keySet().iterator(); while(it1.hasNext()){ String key = it1.next(); System.out.println("Map Value:"+myMap.get(key)); if(key.equals("2")){ myMap.put("1","4"); //myMap.put("4", "4"); } } }}
执行输出结果
List Value:1List Value:2List Value:3Exception in thread "main" java.util.ConcurrentModificationException at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372) at java.util.AbstractList$Itr.next(AbstractList.java:343) at com.journaldev.java.IteratorExample.main(IteratorExample.java:27)
ThreadSafeIteratorExample.java
package com.journaldev.java;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.CopyOnWriteArrayList;/** * 在单线程环境下避免异常发生 * @author Winter Lau (http://www.oschina.net) */public class ThreadSafeIteratorExample { public static void main(String[] args) { List<String> myList = new CopyOnWriteArrayList<String>(); myList.add("1"); myList.add("2"); myList.add("3"); myList.add("4"); myList.add("5"); Iterator<String> it = myList.iterator(); while(it.hasNext()){ String value = it.next(); System.out.println("List Value:"+value); if(value.equals("3")){ myList.remove("4"); myList.add("6"); myList.add("7"); } } System.out.println("List Size:"+myList.size()); Map<String,String> myMap = new ConcurrentHashMap<String,String>(); myMap.put("1", "1"); myMap.put("2", "2"); myMap.put("3", "3"); Iterator<String> it1 = myMap.keySet().iterator(); while(it1.hasNext()){ String key = it1.next(); System.out.println("Map Value:"+myMap.get(key)); if(key.equals("1")){ myMap.remove("3"); myMap.put("4", "4"); myMap.put("5", "5"); } } System.out.println("Map Size:"+myMap.size()); }}
用户点评