在我的应用程序中,我使用了Map来存储POJO对象。按照要求,我需要迭代映射的keySet,并删除不需要任何修改的对象。
请考虑以下代码:
public void remove(Map<String,User> removeUser){
Set<String> keySet = removeUser.keySey();
User user = null;
for(String key : keySet){
user = (user) removeUser.get(key);
if(!user.isActive()){
removeUser.remove(key);
}
}
}在上面的代码中,当我试图在删除对象后获取用户对象时,我得到了ConcurrentModificationException。
有人能告诉我为什么会这样吗?
我没有用多个threading.So不能理解,从哪里产生了ConCurrentModification异常。
甚至我尝试过使用HashMap和哈希表,但问题仍然存在。
发布于 2012-11-19 19:53:12
从中生成ConCurrentModification异常的
。
它来自您在迭代元素的KeySet时试图从Map中删除元素的那行代码。
if(!user.isActive()){
removeUser.remove(key); // This is the problem
}你不应该那样做。如果要修改Collection或Map,请使用iterator。
请看这篇非常好的efficient-equivalent-for-removing-elements-while-iterating-the-collection后文章,它解释了在修改您迭代的集合时可能出现的问题。
下面是一个简单的代码,解释了如何在这里使用它:
Map<String, Integer> map = new HashMap<String, Integer>() {
{
put("a", 1);
put("b", 2);
put("c", 3);
}
};
Iterator<String> iterate = map.keySet().iterator();
while (iterate.hasNext()) {
int i = map.get(iterate.next());
if(i > 1) {
iterate.remove();
}
}
System.out.println(map);输出:-
{a=1}发布于 2012-11-19 19:56:39
如果您使用ConcurrentHashMap,它将不会生成ConcurrentModificationException。
更通用的解决方案是使用迭代器来执行remove()。
public void removeInactiveUsers(Map<String, User> map) {
for (Iterator<User> iter = map.values().iterator(); iter.hasNext(); )
if (!user.isActive())
iter.remove();
}注意:您不需要keySet(),因为您只对values()感兴趣
发布于 2012-11-19 19:53:54
使用迭代器迭代您的集合并使用iterator.remove(),您不能在迭代时从集合中移除元素。您将获得ConcurrentModification Exception
异常的根本原因在这里:
removeUser.remove(key);使用迭代器像这样迭代你的集合。
Iterator<String> itr = keySet .iterator();
while(itr.hasNext){
String s = itr.next();
itr.remove(); // to remove the current element.
}https://stackoverflow.com/questions/13453217
复制相似问题