Java码农必须掌握的循环删除List元素的正确方法!
2023-09-27 14:22:39 时间
首先看下下面的各种删除list元素的例子
public static void main(String\[\] args) {
List<String> 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<String> ite = list.iterator(); ite.hasNext();) {
String str = ite.next();
if (str.contains("b")) {
ite.remove();
}
}
/**
* 报错
* java.util.ConcurrentModificationException
*/
for (Iterator<String> 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循环就不难理解其中的奥秘了。
推荐去我的博客阅读更多:
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
觉得不错,别忘了点赞+转发哦!
相关文章
- Java 一维数组的定义和初始化
- Kotlin和Java EE系列之—— 如何让Kotlin类对Java EE友好
- Java开发知识之JavaIO操作缓存操作
- java中的锁之AbstractQueuedSynchronizer源码分析(三)
- 别再写一堆的 for 循环了!Java 8 中的 Stream 轻松遍历树形结构,是真的牛逼!
- Java:循环输出随机数,直到输出88为止
- java基础(2)循环语句for、while、do...while
- 在java中,如何跳出当前的多重循环?
- java动态代理
- java多线程:循环屏障
- Mongodb系列- java客户端简单使用(CRUD)
- JAVA下实现二叉树的先序、中序、后序、层序遍历(递归和循环)
- Java maven安装GDAL
- JAVA foreach和普通for循环是否需要判断为null
- 强哥说Java--Java 循环语句
- JAVA中简单的for循环竟有这么多坑,但愿你没踩过
- Java高并发专题之17、JUC中的循环栅栏CyclicBarrier
- java基本数据类型
- java web开发(aop编程)
- 用JAVA打印菱形(利用for循环)详细注释
- Java 通过forEach lambda表达式及BinaryOperator实现for循环
- java记事本开发
- 大数据必学Java基础(六十三):COW并发容器讲解
- Java JUC并发包之CyclicBarrier循环栅栏
- 简单JAVA-这是开篇
- java跳出多重循环的方法