Java Map删除元素

误用 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中元素

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值