Java码农必须掌握的循环删除List元素的正确方法!

简介: 首先看下下面的各种删除list元素的例子public static void main(String[] args) {List list = new ArrayList(Arrays.

首先看下下面的各种删除list元素的例子

public static void main(String[] args) {

List list = new ArrayList<>(Arrays.asList("a1", "ab2", "a3", "ab4", "a5", "ab6", "a7", "ab8", "a9"));

/**

*报错

*java.util.ConcurrentModificationException

*/

for (String str : list) {

if (str.contains("b")) {

list.remove(str);

}

}

/**

*报错:下标越界

*java.lang.IndexOutOfBoundsException

*/

int size = list.size();

for (int i = 0; i < size; i++) {

String str = list.get(i);

if (str.contains("b")) {

list.remove(i);

}

}

/**

*正常删除,每次调用size方法,损耗性能,不推荐

*/

for (int i = 0; i < list.size(); i++) {

String str = list.get(i);

if (str.contains("b")) {

list.remove(i);

}

}

/**

*正常删除,推荐使用

*/

for (Iterator ite = list.iterator(); ite.hasNext();) {

String str = ite.next();

if (str.contains("b")) {

ite.remove();

}

}

/**

*报错

*java.util.ConcurrentModificationException

*/

for (Iterator ite = list.iterator(); ite.hasNext();) {

String str = ite.next();

if (str.contains("b")) {

list.remove(str);

}

}

}

报异常IndexOutOfBoundsException我们很理解,是动态删除了元素导致数组下标越界了。

那ConcurrentModificationException呢?

其中,for(xx in xx)是增强的for循环,即迭代器Iterator的加强实现,其内部是调用的Iterator的方法,为什么会报ConcurrentModificationException错误,我们来看下源码

取下个元素的时候都会去判断要修改的数量和期待修改的数量是否一致,不一致则会报错,而通过迭代器本身调用remove方法则不会有这个问题,因为它删除的时候会把这两个数量同步。搞清楚它是增加的for循环就不难理解其中的奥秘了。

相关文章
|
4天前
|
存储 安全 算法
Java一分钟之-Java集合框架入门:List接口与ArrayList
【5月更文挑战第10天】本文介绍了Java集合框架中的`List`接口和`ArrayList`实现类。`List`是有序集合,支持元素重复并能按索引访问。核心方法包括添加、删除、获取和设置元素。`ArrayList`基于动态数组,提供高效随机访问和自动扩容,但非线程安全。文章讨论了三个常见问题:索引越界、遍历时修改集合和并发修改,并给出避免策略。通过示例代码展示了基本操作和安全遍历删除。理解并正确使用`List`和`ArrayList`能提升程序效率和稳定性。
7 0
|
4天前
|
存储 安全 Java
【JAVA基础篇教学】第八篇:Java中List详解说明
【JAVA基础篇教学】第八篇:Java中List详解说明
|
4天前
|
存储 安全 Java
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
|
12天前
|
XML 前端开发 Oracle
16:JSP简介、注释与Scriptlet、Page指令元素、Include操作、内置对象、四种属性-Java Web
16:JSP简介、注释与Scriptlet、Page指令元素、Include操作、内置对象、四种属性-Java Web
14 2
|
14天前
|
安全 Java
循环的时候去删除集合中的元素 java.util.ConcurrentModificationException
循环的时候去删除集合中的元素 java.util.ConcurrentModificationException
|
14天前
|
Java
java Map删除值为null的元素
java Map删除值为null的元素
|
14天前
|
开发者 Python
【亮剑】Python中`List.append()`方法不起作用的原因及解决方案
【4月更文挑战第30天】本文探讨了Python中`List.append()`方法不起作用的原因及解决方案。问题可能源于变量作用域、可变类型与不可变类型混淆、函数内的局部变量、错误的赋值操作或并发修改。解决方法包括检查变量、确保正确操作列表、使用`global`关键字、避免错误赋值和采用同步机制处理并发问题。理解这些问题对于编写健壮的Python代码至关重要。
|
14天前
|
Java API
【亮剑】三种有效的方法来删除List中的重复元素Java的List
【4月更文挑战第30天】本文介绍了三种Java中删除List重复元素的方法:1) 使用HashSet,借助其不允许重复值的特性;2) 利用Java 8 Stream API的distinct()方法;3) 对自定义对象重写equals()和hashCode()。每种方法都附带了代码示例,帮助理解和应用。
|
Java
Java中List排序的3种方法!(5)
Java中List排序的3种方法!(5)
319 0
Java中List排序的3种方法!(5)
|
Java
Java中List排序的3种方法!(4)
Java中List排序的3种方法!(4)
183 0
Java中List排序的3种方法!(4)