arraylist循环删除元素的常见问题及解决方法(代码片段)

brilliantZC brilliantZC     2022-12-03     797

关键词:

一、ArrayList循环删除错误

    今天再写删除ArrayList里面的某个元素时,以为简单循环找出元素在进行删除就可以了,但是却出现了错误。

错误写法一:

public static void main(String[] args) 
        ArrayList<String> list = new ArrayList<>();
        list.add("aa");
        list.add("bb");
        list.add("bb");
        list.add("cc");
        list.add("cc");
        list.add("dd");

        System.out.println("删除前: " + list);

        for (int i = 0; i < list.size(); i++) 
            if ("cc".equals(list.get(i)))
                list.remove(i);
            
        
        System.out.println("删除后: " + list);
        

结果为:

错误写法二

public static void main(String[] args) 
        ArrayList<String> list = new ArrayList<>();
        list.add("aa");
        list.add("bb");
        list.add("bb");
        list.add("cc");
        list.add("cc");
        list.add("dd");

        System.out.println("删除前: " + list);

        for (String s : list) 
            if ("bb".equals(s)) 
                list.remove(s);
            
        
        System.out.println("删除后: " + list);
        

结果为:

二、错误分析

首先看下ArrayList中的remove方法

public boolean remove(Object o) 
        if (o == null) 
            for (int index = 0; index < size; index++)
                if (elementData[index] == null) 
                    fastRemove(index);
                    return true;
                
         else 
            for (int index = 0; index < size; index++)
                if (o.equals(elementData[index])) 
                    fastRemove(index);
                    return true;
                
        
        return false;
    

他们都会调用fastRemove(index)方法:

private void fastRemove(int index) 
        modCount++;
        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work
    

对于错误一:
   由于执行System.arraycopy方法,导致删除元素时涉及到数组元素的移动。在遍历第二个元素字符串cc时因为符合删除条件,所以将该元素从数组中删除,之后的整个数组就和集体往前移动,此次循环结束后的累加器又 +1,所有相邻的一个就会被忽略掉。

对于错误二:
   foreach写法是对实际的Iterable、hasNext、next方法的简写,问题同样在fastRemove方法中,由于第一行中把modCount变量的值加一,但在ArrayList返回的迭代器。

三、解决办法

1、删除后,将指针往前移一位。

public static void main(String[] args) 
        ArrayList<String> list = new ArrayList<>();
        list.add("aa");
        list.add("bb");
        list.add("bb");
        list.add("cc");
        list.add("cc");
        list.add("dd");

        System.out.println("删除前: " + list);

        for (int i = 0; i < list.size(); i++) 
            if ("cc".equals(list.get(i)))
                list.remove(i--);
            
        
        System.out.println("删除后: " + list);
 

2、迭代器删除

public static void main(String[] args) 
        ArrayList<String> list = new ArrayList<>();
        list.add("aa");
        list.add("bb");
        list.add("bb");
        list.add("cc");
        list.add("cc");
        list.add("dd");

        System.out.println("删除前: " + list);

        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext())
            if("cc".equals(iterator.next()))
                //使用迭代器删除
                iterator.remove();
                //在迭代器中用list会报错
                //list.remove("cc");
            
        
        System.out.println("删除后: " + list);

结果均为:

arraylist循环遍历并删除元素的常见陷阱(代码片段)

转自:链接在工作和学习中,经常碰到删除ArrayList里面的某个元素,看似一个很简单的问题,却很容易出bug。不妨把这个问题当做一道面试题目,我想一定能难道不少的人。今天就给大家说一下在ArrayList循环遍历并删除元素的问... 查看详情

arraylist中remove()方法删除长度大于5的元素之后下标重定位的问题

1、问题阐述 需求:有一个ArrayList数组,要求删除长度大于5的字符串,如:arr={"ab1","123ad","bca","dadfadf","dddaaa","你好啊","我来啦","别跑啊"}; 要求结果输出:{"ab1","123ad","bca","你好啊","我来啦","别跑啊"} ... 查看详情

java中循环删除list中元素的方法总结(跳格删除问题解决)(转)(代码片段)

 印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天在使用时发现报错了,然后去科普了一下,再然后发现这是一个误区。下面就来讲一讲。。伸手党可直接跳至文末。看总结。... 查看详情

arraylist的删除姿势你都知道了吗(代码片段)

引言前几天有个读者由于看了《ArrayList哪种遍历效率最好,你真的弄明白了吗?》问了个问题普通for循环ArrayList为什么不能删除连续重复的两个元素?其实这个描述是不正确的。正确的应该是普通for循环正序删除,不能删除连续... 查看详情

java.util.concurrentmodificationexception异常原因及解决方法

在java语言中,ArrayList是一个很常用的类,在编程中经常要对ArrayList进行删除操作,在使用remove方法对ArrayList进行删除操作时,报java.util.ConcurrentModificationException异常,下面探讨一下该异常的原因以及解决办法。1importjava.util.ArrayLi... 查看详情

java.util.concurrentmodificationexception异常原因及解决方法

在java语言中,ArrayList是一个很常用的类,在编程中经常要对ArrayList进行删除操作,在使用remove方法对ArrayList进行删除操作时,报java.util.ConcurrentModificationException异常,下面探讨一下该异常的原因以及解决办法。 1importjava.util.A... 查看详情

arraylist迭代过程删除问题

一:首先看下几个ArrayList循环过程删除元素的方法(一下内容均基于jdk7):packagelist;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.Iterator;importjava.util.List;importjava.util.prefs.Preferences;publicclassListTe 查看详情

arraylist.add后,前面数据被覆盖的问题及解决方法

参考技术AArrayList集合里存的是同一个值,有可能是同一个引用或者就是同一个值。ArrayList<Object>list=newArrayList<Object>();Objectobj;for(inti=10;i>0;i--)  obj=newObject();  //obj=anotherObj;  list.add(obj);像上面一样,... 查看详情

hashmap和list遍历方法总结及如何遍历删除

...uot;ls");famous.add("ww");famous.add("dz");1、for循环遍历list:for(inti=0;i<list.size();i++)if(list.get(i).equals("ls"))list.remove(i);这是一种很常见的遍历方式,但是使用这种遍历删除元素会出现问题,原因在于删除某个元... 查看详情

创建从索引 x 到索引 y 删除 ArrayList 元素的方法

】创建从索引x到索引y删除ArrayList元素的方法【英文标题】:CreatingamethodtoremoveArrayListelementsfromindexxtoindexy【发布时间】:2016-07-0616:34:33【问题描述】:正如标题所说,如果我正在创建一种方法来删除ArrayList的一部分,我将如何处... 查看详情

java中arraylist问题:删除一个arraylist中的重复元素,注意留意一个问题

该问题有两种方法:  一  利用两个数组,此法简单,不讨论  二  利用一个数组,从第0个开始依次取元素,并在其后元素中查找是否有该元素,有则删掉后面的重复元素,依次遍历。---但是这种情况要特别注意,当后... 查看详情

c++stl容器在for循环中删除迭代器正确方法it++正确吗(代码片段)

...出现以下错误,示例代码如下:std::vector<int>arrayList;...std::vector<int>::iteratorit=arrayList.begin();for(;it!=arrayList.end();it++)  if(...)    arrayList.erase(it);显然若条件为真即if(...)为true,那么程序执行调试就... 查看详情

c++stl容器在for循环中删除迭代器正确方法it++正确吗(代码片段)

...出现以下错误,示例代码如下:std::vector<int>arrayList;...std::vector<int>::iteratorit=arrayList.begin();for(;it!=arrayList.end();it++)  if(...)    arrayList.erase(it);显然若条件为真即if(...)为true,那么程序执行调试就... 查看详情

一个arraylist在循环过程中删除,会不会出问题,为什么?(代码片段)

ArrayList中的remove方法(注意ArrayList中的remove有两个同名方法,只是入参不同,这里看的是入参为Object的remove方法)是怎么实现的:publicbooleanremove(Objecto)if(o==null)for(intindex=0;index<size;index++)if(elementData[index]==null)fastRemo 查看详情

javascript使用splice方法删除数组元素可能导致的问题(代码片段)

...码依赖于原数组的长度和索引,就可能会出现错误。影响循环的正确性在循环遍历数组时,如果使用splice方法删除元素,就会改变数组的长度和索引,可能会导致循环出错或漏掉一些元素。特别是在使用for循环时,循环变量的取... 查看详情

集合循环删除问题-报错java.util.concurrentmodificationexception解析

...就会出现java.util.ConcurrentModificationException异常,本文就以ArrayList为例去理解和解决这种异常。一、单线程情况下问题分析及解决方案1.1问题复现先上一段抛 查看详情

js实现循环删除数组中元素的方法介绍

这篇文章主要给大家介绍了关于Javascript循环删除数组中元素的几种方法,文中给出了详细的示例代码供大家参考学习,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。 本文主要跟大家分享了关于Javascript... 查看详情

详解遍历集合和遍历集合时删除集合元素

...汇总一下。遍历集合元素的方式主要有以下几种:这里以ArrayList为例来测试以上几种方式。先创建一个集合元素类。再创建一个遍历集合的测试类:在我的i5-6500CPU电脑上多次测试取遍历操作耗时的平均值,得出这几种方法的遍... 查看详情