带有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 }
你不应该这样做。 如果要修改Collection
或Map
,请使用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. }