Map循环删除或添加出现异常ConcurrentModificationException

本章讲解Map循环删除或添加(子改变key不改变value)出现异常ConcurrentModificationException

1、循环删除报错,咱们看一个最普通的循环map删除

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("name", "刘备");
        map.put("age", "20");
        map.put("Gender", "");
        for (String key : map.keySet()) {
            if (StringUtils.equals(key, "name")) {
                map.remove(key);
            }
        }

执行这段代码会出现报错ConcurrentModificationException。

ConcurrentModificationException:这个错误的意思同时修改异常,java不允许对Map遍历时又对这个Map进行修改或者删除

这个时候就需要使用迭代器,迭代器也是Map转过来的,所以要删除还是不能使用: map.remove(key);,只能使用迭代器特有的删除:iterator.remove();

 Map<String, Object> map = new HashMap<String, Object>();
        map.put("name", "刘备");
        map.put("age", "20");
        map.put("Gender", "");
        Set<Map.Entry<String, Object>> entries = map.entrySet();
        Iterator<Map.Entry<String, Object>> iterator = entries.iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, Object> next = iterator.next();
            if (StringUtils.equals(next.getKey(), "name")) {
                iterator.remove();
            }
        }

接下来咱们就说说遍历时添加的情况(可以说是改变key但是不改变value)

上面说了一种使用普通遍历方式删除,现在说使用迭代器遍历时对map进行添加

当然这个也会报错:ConcurrentModificationException,这个异常和上面的错误一样

    Map<String, Object> map = new HashMap<String, Object>();
        map.put("name", "刘备");
        map.put("age", "20");
        map.put("Gender", "");
        Set<Map.Entry<String, Object>> entries = map.entrySet();
        Iterator<Map.Entry<String, Object>> iterator = entries.iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, Object> next = iterator.next();
            if (StringUtils.equals(next.getKey(), "name")) {
                map.put("school", "希望小学");
            }
        }

下面讲解正确的方法。

思路:创建一个新的map,把原来需要修改的key的value保存,再把需要修改后的map的key保存,把新的key和只保存在新创建的map中,在循环这个新的map保存到原来的map即可

上代码:这里怕有人不理解,所有就一步一步写并携带注释

打印结果:{name111=刘备, name=刘备, Gender=男, age=20}

 //这是原来的map
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("name", "刘备");
        map.put("age", "20");
        map.put("Gender", "");
        //创建一个新的map
        Map<String, Object> newMap = new HashMap<String, Object>();
        Set<Map.Entry<String, Object>> entries = map.entrySet();
        Iterator<Map.Entry<String, Object>> iterator = entries.iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, Object> next = iterator.next();
            //获取原来map的key
            String key = next.getKey();
            if (StringUtils.equals(key, "name")) {
                //获取原来map的value
                Object value = map.get(key);
                //新的key
                String newKey = key + "111";
                //把新的key和value保存到新的map中
                newMap.put(newKey, value);
            }
        }
        //这里只是获取没有修改,所以使用普通的遍历就可以
        for (String key : newMap.keySet()) {
            //获取value
            Object value = newMap.get(key);
            //把数据添加到原来的map中
            map.put(key, value);
        }
        System.out.println(map);

 

posted @ 2021-07-13 21:54  小小小爸爸  阅读(1255)  评论(0)    收藏  举报