带有Map和Hashtable的ConcurrentModificationexception

在我的应用程序中,我使用了Map来存储POJO对象。 根据要求,我需要迭代Map的keySet并删除不需要任何修改的对象。

考虑下面的代码..

public void remove(Map removeUser){ Set keySet = removeUser.keySey(); User user = null; for(String key : keySet){ user = (user) removeUser.get(key); if(!user.isActive()){ removeUser.remove(key); } } } 

这里在上面的代码中,当我尝试在删除对象后获取User对象时,我收到ConcurrentModificationException。

谁能告诉我为什么会发生?

我没有使用multithreading。所以无法理解,从哪里生成ConCurrentModification Exception。

即使我尝试使用HashMap和Hashtable,但问题仍然存在。

谢谢,Gunjan。

从它生成ConCurrentModificationexception的地方。

它来自于您尝试在迭代其KeySet时从Map删除元素的KeySet

 if(!user.isActive()){ removeUser.remove(key); // This is the problem } 

你不应该这样做。 如果要修改CollectionMap ,请使用iterator


看到这个非常好的post – 高效 – 等同于删除元素 – 迭代 – 集合,解释了在修改迭代的集合时可能出现的问题。


这是一个简单的代码,解释了如何在这里使用它: –

  Map map = new HashMap() { { put("a", 1); put("b", 2); put("c", 3); } }; Iterator iterate = map.keySet().iterator(); while (iterate.hasNext()) { int i = map.get(iterate.next()); if(i > 1) { iterate.remove(); } } System.out.println(map); 

输出: –

 {a=1} 

如果使用ConcurrentHashMap,则不会产生ConcurrentModificationException。

更通用的解决方案是使用Iterator来执行remove()。

 public void removeInactiveUsers(Map map) { for (Iterator iter = map.values().iterator(); iter.hasNext(); ) if (!user.isActive()) iter.remove(); } 

注意:您不需要keySet()因为您只对values()感兴趣

使用迭代器迭代你的Set并使用iterator.remove() ,你不能在迭代它时从你的集合中 删除元素。你会得到一个ConcurrentModificationexception

您的例外的根本原因在于:

  removeUser.remove(key); 

使用迭代器迭代你的集合。

 Iterator itr = keySet .iterator(); while(itr.hasNext){ String s = itr.next(); itr.remove(); // to remove the current element. }