map遍历删除异常:ConcurrentModificationException

本文详细介绍了Java中Map集合的删除操作,包括单个删除和遍历删除。在遍历删除时,直接使用forEach会抛出`ConcurrentModificationException`,因为不允许在遍历过程中修改集合。正确的做法是使用Iterator迭代器进行删除。文章通过实例代码展示了如何安全地删除Map中满足特定条件的元素,并给出了详细的解释。
摘要由CSDN通过智能技术生成

一、 map集合单个删除

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

二、map集合遍历删除多个


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

为什么呢?

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

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

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

三、案例


有如下集合:

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.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());
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值