map遍历删除异常:ConcurrentModificationException

1. map集合单个删除

此时,一般都不会出问题,直接 remove(key)

2. map集合遍历删除多个

此时,若不注意往往容易出现问题,出现 ConcurrentModificationException

为什么呢?

  • 使用iterator迭代删除时没有问题的,在每一次迭代时都会调用hasNext()方法判断是否有下一个,是允许集合中数据增加和减少的。

  • 使用forEach删除时,会报错ConcurrentModificationException,因为在forEach遍历时,是不允许map元素进行删除和增加。

所以,遍历删除map集合中元素时,必须使用迭代iterator


3. 案例

有如下集合:

Map<String, Integer> map=new HashMap<>();
    map.put("张三",22);
    map.put("李四",25);
    map.put("王五",33);
    map.put("赵六",28);
    map.put("田七",25);
    map.put("李思",25);
    map.put("李嘉欣",25);

需求:删除名字(即key)中包含“李”的元素


使用forEach时:

Set<Entry<String, Integer>> set=map.entrySet();

for (Entry<String, Integer> entry : set) {
    String name=entry.getKey();
    System.out.println(name);
    System.out.println(name.contains("李"));
    if(name.contains("李")){
        map.remove(name);
    }
}

会报如下异常:

这里写图片描述


使用iterator时,一切正常

特别注意:删除时不能使用map.remove(key),否则也报ConcurrentModificationException

只能使用iterator.remove

Set<Entry<String, Integer>> set=map.entrySet();

Iterator<Entry<String, Integer>> iterator=set.iterator();

while(iterator.hasNext()){
    Entry<String, Integer> entry=iterator.next();
    String name=entry.getKey();
    if(name.contains("李")){
    //特别注意:不能使用map.remove(name)  否则会报同样的错误
        iterator.remove();
    }
}

解释:Iterator.remove()是删除最近(最后)使用next()方法的元素。
从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。每次调用 next 只能调用一次此方法。


完成代码:

package map遍历和删除;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/*map集合遍历删除*/
public class Test2 {
    public static void main(String[] args) {
        //key=name value=age
        Map<String, Integer> map=new HashMap<>();
        map.put("张三",22);
        map.put("李四",25);
        map.put("王五",33);
        map.put("赵六",28);
        map.put("田七",25);
        map.put("李思",25);
        map.put("李嘉欣",25);

        //单个删除删--remove  
        map.remove("张三");
        for(Map.Entry<String, Integer> entry:map.entrySet()){
            System.out.println(entry.getKey()+"="+entry.getValue());
        }

        //需求:删除名字(即key)中包含“李”的元素
        /*分析:
         *  1.此时直接map.remove(key)就不符合要求了,必须进行遍历删除
         *  
         *  2.通常map集合遍历就两种方式,一个foreach和iterator
         * */

        Set<Entry<String, Integer>> set=map.entrySet();

        /*for (Entry<String, Integer> entry : set) {
            String name=entry.getKey();
            System.out.println(name);
            System.out.println(name.contains("李"));
            if(name.contains("李")){
                map.remove(name);
            }
        }*/


        Iterator<Entry<String, Integer>> iterator=set.iterator();
        while(iterator.hasNext()){
            Entry<String, Integer> entry=iterator.next();
//          String name=entry.getKey();
            String name=entry.getKey();
            int value=entry.getValue();
            if(name.contains("李")){
                //特别注意:不能使用map.remove(name)  否则会报同样的错误
                iterator.remove();
            }
        }

        System.out.println();
        for (Entry<String, Integer> entry : set) {
            System.out.println("姓名:"+entry.getKey()+",年龄:"+entry.getValue());
        }
    }
}
  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值