首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >映射和哈希表的ConcurrentModification异常

映射和哈希表的ConcurrentModification异常
EN

Stack Overflow用户
提问于 2012-11-19 19:51:32
回答 3查看 3.6K关注 0票数 2

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

请考虑以下代码:

代码语言:javascript
复制
 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和哈希表,但问题仍然存在。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-19 19:53:12

从中生成ConCurrentModification异常的

它来自您在迭代元素的KeySet时试图从Map中删除元素的那行代码。

代码语言:javascript
复制
if(!user.isActive()){
     removeUser.remove(key);  // This is the problem
}

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

请看这篇非常好的efficient-equivalent-for-removing-elements-while-iterating-the-collection后文章,它解释了在修改您迭代的集合时可能出现的问题。

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

代码语言:javascript
复制
    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);

输出:-

代码语言:javascript
复制
{a=1}
票数 10
EN

Stack Overflow用户

发布于 2012-11-19 19:56:39

如果您使用ConcurrentHashMap,它将不会生成ConcurrentModificationException。

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

代码语言:javascript
复制
public void removeInactiveUsers(Map<String, User> map) {
    for (Iterator<User> iter = map.values().iterator(); iter.hasNext(); ) 
        if (!user.isActive())
            iter.remove();
}

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

票数 4
EN

Stack Overflow用户

发布于 2012-11-19 19:53:54

使用迭代器迭代您的集合并使用iterator.remove(),您不能在迭代时从集合中移除元素。您将获得ConcurrentModification Exception

异常的根本原因在这里:

代码语言:javascript
复制
        removeUser.remove(key);

使用迭代器像这样迭代你的集合。

代码语言:javascript
复制
Iterator<String> itr = keySet .iterator();
while(itr.hasNext){
   String s = itr.next();
   itr.remove(); // to remove the current element.
 }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13453217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档