本章讲解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);