遍历ArrayList的过程中移除元素的方式

遍历ArrayList的过程中移除元素的方式错误方法一使用for循环正序遍历ArrayList,使用remove移除元素结果如下,只删除了一个“3”原因:在匹配到第一个要删除的元素并移除时,后面元素会往前移位,导致索引位置改变,从而漏掉后面一个元素。publicstaticvoidmain(String[]args){ ArrayList<String>list=newArrayList<>(); list.add(“1”); list.add(“2”); list.add(“3”

大家好,又见面了,我是你们的朋友全栈君。

错误方法一

使用for循环正序遍历ArrayList,使用remove移除元素
结果如下,只删除了一个“3”

原因:在匹配到第一个要删除的元素并移除时,后面元素会往前移位,导致索引位置改变,从而漏掉后面一个元素。

public static void main(String[] args) { 
   
	 ArrayList<String> list = new ArrayList<>();
	 list.add("1");
	 list.add("2");
	 list.add("3");
	 list.add("3");
	 list.add("5");
	 list.add("6");
	 list.add("7");
	
	 for (int i = 0; i < list.size(); i++){ 
   
	     if (list.get(i).equals("3"))
	         list.remove(i);
	 }
	 
	 System.out.println(list);
}
原list:[1, 2, 3, 3, 5, 6, 7]
移除后: [1, 2, 3, 5, 6, 7]

错误方法二

使用增强for循环遍历ArrayList移除元素,
会产生java.util.ConcurrentModificationException,因为元素在使用的时候发生了并发的修改,导致异常抛出

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

结果:

Exception in thread "main" java.util.ConcurrentModificationException

正确方法一

使用for循环倒序遍历ArrayList,使用remove移除元素
数组倒序遍历时即使发生元素删除也不影响后序元素遍历,因为前面的元素位置不会改变。

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

正确方法二

使用迭代器remove方法删除(推荐)

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){ 
   
    String s = iterator.next();
    if (s.equals("3"))
        iterator.remove();
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163103.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • opencv gamma校正_opencv resize函数踩坑

    opencv gamma校正_opencv resize函数踩坑//链接https://blog.csdn.net/linqianbi/article/details/78617615//Gamma校正#include<iostream>#include<opencv2\core\core.hpp>#include<opencv2\highgui\highgui.hpp>#include<opencv2\imgproc\imgproc.hpp>#include<cm…

    2022年9月16日
    0
  • Fastai安装_fastai

    Fastai安装_fastai本文为译文,主要介绍安装问题。Fastaigithub原文地址:https://github.com/fastai/fastai/blob/master/README.md#is-my-system-supported注意事项:fastaiv1目前只支持Linux,并且需要PyTorchv1和Python3.6或更高版本。Windows还处于试验阶段:应该可以很好地工作,但还没有全面的测…

    2022年9月8日
    0
  • mongodb联表查询_mongodb聚合查询

    mongodb联表查询_mongodb聚合查询  在使用MongoDB存储数据的时候,我们查询的时候,有时候难免会需要进行连表查询。但是MongoDB本身是非关系性数据库,连表查询,很多时候,需要我们自己在代码里手工操作。但是从MongoDB3.2版本过后,我们可以使用lookup∗∗∗进行连表查询。下面就简单介绍一下MongoDB的∗∗∗lookup∗∗∗进行连表查询。下面就简单介绍一下MongoDB的∗∗∗lookup***进行…

    2022年9月14日
    0
  • 简易的倒计时代码_简单的网页代码

    简易的倒计时代码_简单的网页代码在一些活动项目中,大多会涉及倒计时。以下为倒计时代码,供小白参考。关键词:计时器、时间差具体代码如下:&lt;!DOCTYPEhtml&gt;&lt;html&gt; &lt;head&gt; &lt;metacharset="utf-8"/&gt; &lt;title&gt;倒计时代码&lt;/title&gt; &lt;styletype="te

    2022年4月19日
    53
  • OpenCV实现SfM(四):Bundle Adjustment

    OpenCV实现SfM(四):Bundle Adjustment使用CeresSolver实现三维重建中的BundleAdjustment.

    2022年6月20日
    37
  • 再谈肥六之应用软件

    再谈肥六之应用软件1、系统管理:SmartFileman和SeleQ。后者自不多说,是S60平台上的经典软件,界面亲和、功能强大;后者Fileman是我现在所用的系统管理软件,个人觉得此款软件更顺手些——打开软件后便可以清楚显示手机各盘的存储情况(剩余空间/总空间)、功能一应俱全、图标清晰形象……总之,个人比较偏爱于Fileman。  2、内存管理:APPMAN。功能极为强大,能够显示当前系统资源的利用情…

    2022年7月11日
    15

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号