误用 map.remove会报错
for (Map.Entry<Integer, String> entry : map.entrySet()) {
Integer key = entry.getKey();
if (key % 2 == 0) {
map.remove(key);
}
}
# 此时就会报java.util.ConcurrentModificationException错误
原因
基本上java集合类(包括list和map)在遍历时没用迭代器进行删除了都会报ConcurrentModificationException
错误,这是一种fast-fail
的机制,初衷是为了检测bug。通俗一点来说,这种机制就是为了防止高并发的情况下,多个线程同时修改map或者list的元素导致的数据不一致,这是只要判断当前modCount != expectedModCount
即可以知道有其他线程修改了集合。
解决方案:
1、用迭代器的remove方法。
# 迭代器删除元素
# 会删除所有符合条件的元素
Map<Integer, String> map = new HashMap<>();
Iterator<Map.Entry<Integer, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<Integer, String> entry = iterator.next();
if (entry.getKey() == 1) {
iterator.remove();
}
}
其他用法:
# java8 removeIf删除元素
Map<Integer, String> map = new HashMap<>();
map.entrySet().removeIf(entry -> entry.getKey() != 1); 删除符合条件的Entry
map.keySet().removeIf(key -> key != 1); 删除符合条件的Entry
map.values().removeIf(value -> value.contains("1")); 删除符合条件的Entry
[Ref] HashMap遍历的时候使用map.remove会报错
[Ref] Java删除Map中元素