java遍历list删除元素 java遍历list删除元素讲解

路上碾压了一只鸡,就想找人讨要赔偿。看到一个小女孩!我:“儿子!这是你的鸡吗?”孩子:“不!我的鸡没那么平。”?ArrayList使用forEach遍历时,删除元素会出错吗?答:其实不一定。如果删除的元素是倒数第二个,它不会报告错误,否则,它将报告一个错误Concurrentmodificat...

路上碾压了一只鸡,就想找人讨要赔偿。

看到一个小女孩!我:“儿子!这是你的鸡吗?”

孩子:“不!我的鸡没那么平。”?

ArrayList使用forEach遍历时,删除元素会出错吗?

答:其实不一定。如果删除的元素是倒数第二个,它不会报告错误,否则,它将报告一个错误ConcurrentmodificationException。(A,会报错,没毛病)

原因:例如

List<String> lists = new ArrayList<String>();lists.add("1");lists.add("2");lists.add("3");lists.add("4");

如果要删除一个等于“3”的元素,我们都知道ArrayList的底层是以数组的形式存储数据的。生成一个元素后,后面的元素必须向前移动,列表的大小减少1。此时,列表变成大小为3的["1 "、" 2 "、" 4"]。

使用forEach遍历时:

for(String s :lists){ if(s.equals("3")){ lists.remove(s); }} //这是一颗语法糖,编译后相当于:for(Iterator i = lists.iterator();i.hasNext();){ String s = (String)i.next(); if(s.equals("3")){ list.remove(s); }}

迭代器的hasNext()方法确定大小是否与当前下标游标相同。如果大小相同,则没有剩余的元素。

如果删除元素“3”,大小将变为3。此时遍历的下标光标正好是3,所以不会进行下一个循环,直接结束。此时,元素“4”还没有被遍历。

如果列表中的元素是[“1”、“2”、“3”、“4”和“5”],即3不再是倒数第二个元素怎么办?

此时,将进行下一个循环。首先判断i.hasNext(),当前下标光标不等于size。执行i.next(),试图取出下一个值“4”。此时,会报告一个错误。原因在i.next():

public E next() { checkForComodification(); int i = cursor; if (i >= size) throw new NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) throw new ConcurrentModificationException(); cursor = i + 1; return (E) elementData[lastRet = i];}final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException();}

迭代器取下一个值时,会先判断modCount是否与expectedModCount相同。如果不同,它将报告一个错误。

这里,modCount是被删除元素的数量计数,expectedModCount是迭代器期望的被删除元素的数量。使用迭代器的remove()方法时,迭代器会调用ArrayList。This.remove (latest)在制作modCount++时删除元素,然后将modCount的值赋给expectedModCount,保证两者相同。

所以这里就能发现问题了。在forEach循环中,我们直接使用lists.remove ("3 ")的方法删除元素,导致expectedModCount和ModCount不一致。

因此,要在遍历过程中删除元素,应该使用Iterator的方法,而不是forEach遍历。

下面是修改后的代码:

String s= null;for(Iterator i = lists.iterator(); i.hasNext(); ){ s=(String)i.next(); if(s.equals("3")){ i.remove(); }}

另一种方法是使用CopyOnWriteArrayList,而不是ArrayList,ArrayList是一个写时***容器。每次添加或删除一个元素,都会***一个旧数据,创建一个新数据,修改新数据后,旧数据的指针会修改为指向新数据。

这样遍历的数据实际上是第一个旧数据,旧数据是不变的。我们遍历旧数据,用新数据判断值。

画一张图来表达我的理解:

资料来源:blog.csdn.net/awocbb/article/details/85069427

本文来自玩味不尽投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/634524.html

打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
() 0
上一篇 07-15
下一篇 07-15

相关推荐

  • java项目开发案例经典 java初学者简易小程序

    项目–吃货联盟一、项目准备:1.开发环境:JDK1.8IntelliJ IDEA2.技术要点分析:能理解程序基本概念 – 程序会使用变量、数据类型会使用顺序、选择、循环、跳转语句编写程序会使用数组3.任务描述:只要动动手指,就能送餐上门。“网上订餐受到现代人的青睐。现在,开发了一个

    2023-07-28 08:47:01
    708 0
  • java创建数组的几种方式 java编写图形界面程序

    数组是一组具有相同数据类型的数据。作为对象,new关键字允许用于内存分配。首先,熟悉一维数组的创建和使用。有两种方法可以声明一维数组:元素类型数组名称[];元素类型[]数组名称;元素类型决定数组的数据类型,在java中可以是任意数据类型,声明一个一维数组,比如int arr

    2023-07-27 04:07:01
    981 0
  • 如何安装java运行环境 java环境配置教程

    手动安装可以让用户更好地控制Java运行时环境。使用Linux发行版的包管理工具很容易安装Java包。但是,有时候需要手动安装Java。这对于Tomcat或JBoss等基于Java的应用服务器的管理员来说尤其重要。许多开源和专有软件产品依赖于这些服务。还是开发人员运行时套件?Java虚拟机(

    2023-07-26 08:27:01
    539 0
  • java是什么软件有什么作用 深入解析Java编程语言

    很多人或多或少和我一样。当我偶然在电视上看到程序员往电脑里敲一串代码的时候,我会忍不住惊叹他们,想象自己有一天也能这样。是的,有一天你也可以这样做!我们来看看到底什么是J***A?为什么学习?学习有什么用?让我给你看看2009年的计算机语言排名1。什么是JavaJava是一

    2023-07-26 04:56:01
    150 0

评论列表

联系我们

在线咨询: QQ交谈

邮件:admin@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信