List一边循环一边删除会如何?如何解决?

2024-02-29 16:59
文章标签 解决 删除 循环 list 一边

本文主要是介绍List一边循环一边删除会如何?如何解决?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这一个很经典的面试题,相信很多求职者或者新手开发都遇见过。本文主要深究一下为什么list循环删除会抛出异常?如何避免这种情况?

一、增强for循环

package com.bootMybatis.demo;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/*** @Author: yd* @Date: 2020/7/18 10:17*/
public class ListDemo {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("a");list.add("b");list.add("c");list.add("a");list.add("d");// foreachfor (String str: list) {if ("a".equals(str)) {list.remove(str);}}}
}

运行会抛出:java.util.ConcurrentModificationException 异常具体信息如下:

Exception in thread "main" java.util.ConcurrentModificationExceptionat java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)at java.util.ArrayList$Itr.next(ArrayList.java:859)at com.bootMybatis.demo.ListDemo.main(ListDemo.java:23)

通过源码分析,我们可以看出来抛出的异常,当获取下一个元素的时候,会先去校验这两个变量是否相等,第一次remove之后,modCount的值由5变成了6,这样就导致了值不相同抛出异常。

二、普通for循环

package com.bootMybatis.demo;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class ListDemo {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("a");list.add("a");list.add("b");list.add("c");list.add("a");list.add("d");// 普通for循环for (int i = 0; i < list.size();i++){if (list.get(i).equals("a")){list.remove(list.get(i));}}for (String string:list) {System.out.println(string);}}
}

通过这种普通循环删除元素你会发现你要删除的元素存在多个时删除不完,因为删除元素后,数组下标变化了,下一个元素就不会进入比较了。

三、迭代器 用list的remove方法

package com.bootMybatis.demo;import org.hibernate.validator.constraints.EAN;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/*** @Author: yd* @Date: 2020/7/18 10:17*/
public class ListDemo {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("a");list.add("a");list.add("b");list.add("c");list.add("a");list.add("d");// 迭代器循环Iterator<String> iterator = list.iterator();while(iterator.hasNext()){String str = iterator.next();if ("a".equals(str)){list.remove(str);}}}
}

这种方式会抛出和增强for循环一样的异常,引起的原因相同。

四、迭代器的remove方法

package com.bootMybatis.demo;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/*** @Author: yd* @Date: 2020/7/18 10:17*/
public class ListDemo {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("a");list.add("a");list.add("b");list.add("c");list.add("a");list.add("d");// 迭代器循环Iterator<String> iterator1 = list.iterator();while(iterator1.hasNext()){String str = iterator1.next();if ("a".equals(str)){iterator1.remove();}}}
}

这种方式可以完美解决循环删除的问题。

五、JDK 1.8 的for循环

package com.bootMybatis.demo;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/*** @Author: yd* @Date: 2020/7/18 10:17*/
public class ListDemo {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("a");list.add("a");list.add("b");list.add("c");list.add("a");list.add("d");// JDK 1.8 的循环list.forEach(str -> {if ("a".equals(str)){list.remove(str);}});System.out.println(list.size());}
}

这种方式也会抛出异常:java.util.ConcurrentModificationException ,我们可以通过源码发现还是由于expectedModCount和modCount的值不同导致的异常。

 

这篇关于List一边循环一边删除会如何?如何解决?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/759420

相关文章

Python列表的创建与删除的操作指南

《Python列表的创建与删除的操作指南》列表(list)是Python中最常用、最灵活的内置数据结构之一,它支持动态扩容、混合类型、嵌套结构,几乎无处不在,但你真的会创建和删除列表吗,本文给大家介绍... 目录一、前言二、列表的创建方式1. 字面量语法(最常用)2. 使用list()构造器3. 列表推导式

MyBatis-Plus逻辑删除实现过程

《MyBatis-Plus逻辑删除实现过程》本文介绍了MyBatis-Plus如何实现逻辑删除功能,包括自动填充字段、配置与实现步骤、常见应用场景,并展示了如何使用remove方法进行逻辑删除,逻辑删... 目录1. 逻辑删除的必要性编程1.1 逻辑删除的定义1.2 逻辑删php除的优点1.3 适用场景2.

解决idea启动项目报错java: OutOfMemoryError: insufficient memory

《解决idea启动项目报错java:OutOfMemoryError:insufficientmemory》:本文主要介绍解决idea启动项目报错java:OutOfMemoryError... 目录原因:解决:总结 原因:在Java中遇到OutOfMemoryError: insufficient me

maven异常Invalid bound statement(not found)的问题解决

《maven异常Invalidboundstatement(notfound)的问题解决》本文详细介绍了Maven项目中常见的Invalidboundstatement异常及其解决方案,文中通过... 目录Maven异常:Invalid bound statement (not found) 详解问题描述可

C# List.Sort四种重载总结

《C#List.Sort四种重载总结》本文详细分析了C#中List.Sort()方法的四种重载形式及其实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录1. Sort方法的四种重载2. 具体使用- List.Sort();- IComparable

nacos服务无法注册到nacos服务中心问题及解决

《nacos服务无法注册到nacos服务中心问题及解决》本文详细描述了在Linux服务器上使用Tomcat启动Java程序时,服务无法注册到Nacos的排查过程,通过一系列排查步骤,发现问题出在Tom... 目录简介依赖异常情况排查断点调试原因解决NacosRegisterOnWar结果总结简介1、程序在

C#实现插入与删除Word文档目录的完整指南

《C#实现插入与删除Word文档目录的完整指南》在日常的办公自动化或文档处理场景中,Word文档的目录扮演着至关重要的角色,本文将深入探讨如何利用强大的第三方库Spire.Docfor.NET,在C#... 目录Spire.Doc for .NET 库:Word 文档处理利器自动化生成:C# 插入 Word

MySQL中的DELETE删除数据及注意事项

《MySQL中的DELETE删除数据及注意事项》MySQL的DELETE语句是数据库操作中不可或缺的一部分,通过合理使用索引、批量删除、避免全表删除、使用TRUNCATE、使用ORDERBY和LIMI... 目录1. 基本语法单表删除2. 高级用法使用子查询删除删除多表3. 性能优化策略使用索引批量删除避免

使用Python实现在PDF中添加、导入、复制、移动与删除页面

《使用Python实现在PDF中添加、导入、复制、移动与删除页面》在日常办公和自动化任务中,我们经常需要对PDF文件进行页面级的编辑,使用Python,你可以轻松实现这些操作,而无需依赖AdobeAc... 目录1. 向 PDF 添加空白页2. 从另一个 PDF 导入页面3. 删除 PDF 中的页面4. 在

解决java.util.RandomAccessSubList cannot be cast to java.util.ArrayList错误的问题

《解决java.util.RandomAccessSubListcannotbecasttojava.util.ArrayList错误的问题》当你尝试将RandomAccessSubList... 目录Java.util.RandomAccessSubList cannot be cast to java.