首页 > 其他分享 >list - 删除元素 ConcurrentModificationException

list - 删除元素 ConcurrentModificationException

时间:2023-05-24 13:34:57浏览次数:38  
标签:String 删除 ConcurrentModificationException list remove item add List

 

前天看了公众号,说是三年开发都不会删除元素,看了一眼,没想到第二天就用上了........而我也是那个菜鸟哈哈哈哈哈哈.........记录一下吧

 

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("1");
    list.add("2");
    list.add("3");

    for (String s : list) {
        if (s.equals("1")) {
            list.remove(s);
        }
    }

    System.out.println(list);
}

移除元素的时候想到的就是List的remove()方法,然后出现报错  java.util.ConcurrentModificationException

 

原因是,将上面代码转变为字节码,会发现for循环在执行的时候实际使用的是Iterator,核心方法是hasNext()和next()

而这两个方法的底层原理

 

在使用next()时,调用checkForComodification()方法

next()在获取下一个元素时,比较modCount 和 expectedModCount 两个值

在使用remove时,modCount++,第二次再remove的时候值不相等就会抛错

 

 

 解决方法:

第一种-----使用Iterator的remove()方法

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("1");
    list.add("2");
    list.add("3");

    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
        String s = iterator.next();
        if (s.equals("1")) {
            iterator.remove();
        }
    }

    System.out.println(list);
}

 底层:每次remove会重新赋值

 

 第二种-------for循环正序(修改下标)

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("1");
    list.add("2");
    list.add("3");

    for (int i = 0; i < list.size(); i++) {
        String item = list.get(i);
        if (item.equals("1")) {
            list.remove(item); 
            i = i - 1;
        }
    }

    System.out.println(list);
}

 

 第三种---------for循环倒序

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("1");
    list.add("2");
    list.add("3");

    for (int i = list.size() - 1; i >= 0; i--) {
        String item = list.get(i);
        if (item.equals("1")) {
            list.remove(item); 
            i = i - 1;
        }
    }

    System.out.println(list);
}

 

 最后可以使用stream流

public static void main(String[] args) {
 List<String> list = new ArrayList();
    list.add("1");
    list.add("2");
    list.add("3");
    list = list.stream().filter(e -> !e.startsWith("1")).collect(Collectors.toList());
    System.out.println(list);
}

 

标签:String,删除,ConcurrentModificationException,list,remove,item,add,List
From: https://www.cnblogs.com/shirleyxueli/p/17428041.html

相关文章

  • 如何实现java8 list按照元素的某个字段去重
    list按照元素的某个字段去重1234567@Data@AllArgsConstructor@NoArgsConstructorpublicclassStudent{privateIntegerage;privateStringname;}测试数据12345List<Student>studentList=Lists.newArrayList();studentL......
  • DDL之修改及删除数据库
    修改数据库alterdatabase数据库名character set字符集删除数据库,dropdatabase数据库名字alter修改drop删除练习--修改字符集alterdatabasedb1charactersetutf8;/*查看字符集修改成功CREATEDATABASE`db1`/*!40100DEFAULTCHARACTERSETutf8*//*!80016......
  • kettle 连接oracle 12c以上数据库报错 ORA-12505, TNS:listener does not currently k
    在通过kettle连接oracle数据库时报错,但通过plsql是能正常连接的,ORA-12505,TNS:listenerdoesnotcurrentlyknowofSIDgiveninconnectdescriptororg.pentaho.di.core.exception.KettleDatabaseException:来看oracle数据库版本select*fromv$version;连接oracle12c以......
  • SpringBoot中操作Redis解析JsonArray数据为对象List(ruoyi字典值sys_dict为例)
    场景若依前后端分离版手把手教你本地搭建环境并运行项目:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662在上面搭建系统的基础上,会将系统的字典值缓存进redis中。看数据格式存储的是Json数组,如何从redis中读取并解析成对象的list从而进行数据处理。注......
  • Python中对列表list去重
    保留原顺序。old_list=[2,3,4,5,1,2,3]new_list=[]foriinold_list:ifinotinnew_list:new_list.append(i)print(new_list)#[2,3,4,5,1]用字典dict去重使用list项作为键创建dict,这将自动删除任何重复项,因为dict不能有重复的键,保留原......
  • 删除kibana
    假设是centos7环境停止Kibana服务:systemctlstopkibana.service禁用Kibana服务,以确保它不会在启动时自动启动:systemctldisablekibana.service删除Kibana的安装目录。默认情况下,Kibana安装在/usr/share/kibana/下,因此可以使用以下命令删除该目录及其子目录:sudorm-rf/u......
  • 2)MySQL表管理之创建删除、约束实施、自增长字段、复制表结构
    一、表操作:创建表:createtabletablename(字段名1数据类型,...字段名n数据类型);查看当前数据库中所有表:showtables;查看指定表的结构:desc[ribe]table_name;查看指定表的详细信息:showcreatetabletable_name;......
  • 双重循环----删除(避坑)
    1、双重for循环删除有坑要注意在正向遍历删除时,数组长度会变短,数据下标会变化,数据向前移动会漏掉一些数据的比对解决办法:换成逆向遍历2、js从一个数组中删除另一个数组中存在的元素//从一个数组中删除另一个数组中存在的元素letarray=[{id:11},{id:22},{id:33},{......
  • list转换成树形结构
    importcn.hutool.core.collection.CollectionUtil;importcn.hutool.core.util.StrUtil;importcn.hutool.json.JSONUtil;importcom.alibaba.fastjson.JSON;importorg.springframework.stereotype.Component;importjava.lang.reflect.Field;importjava.util.Array......
  • redis专题六:redis 删除策略、淘汰策略、数据库与缓存数据一致性、事物、发布订阅
    文章目录一、删除策略二、淘汰策略三、数据库与缓存数据一致性四、redis事务五、redis发布订阅一、删除策略redis使用:惰性删除+定期删除1、定时删除–>以CPU内存换redis内存定时删除过期的缓存值2、惰性删除–>以redis内存换CPU内存查询到该key时如果过期,删除该过期的缓存值......