昨天遇到一个问题,就是在遍历Map的时候,报了一个异常:
java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextNode(HashMap.java:1437) at java.util.HashMap$EntryIterator.next(HashMap.java:1471) at java.util.HashMap$EntryIterator.next(HashMap.java:1469)
发现原因如下:
Iterator做遍历的时候,HashMap被修改时会检查HashMap的size,size发生变化,抛出错误ConcurrentModificationException。
给出的解决方案如下:
1) 通过Iterator修改Hashtable
while(it.hasNext()) {
Object ele = it.next();
it.remove();
}
2) 根据实际程序,您自己手动给Iterator遍历的那段程序加锁,给修改HashMap的那段程序加锁。
3) 使用“ConcurrentHashMap”替换HashMap
ConcurrentHashMap会自己检查修改操作,对其加锁,也可针对插入操作。
import java.util.concurrent.*;
我采用的是第三种,代码如下:
Map<String, String> map = new ConcurrentHashMap<String, String>(); map.putAll(param); for (Map.Entry<String, String> entry : map.entrySet()) { String key = entry.getKey(); map.remove(key); }
其中param就是调用类传入的map,把它转成 ConcurrentHashMap,然后再进行循环操作。