当前位置: 首页 > 科技观察

JavaArrayList删除特定元素的方法

时间:2023-03-11 23:56:42 科技观察

ArrayList是最常用的java集合,我们在开发中经常需要删除ArrayList中的特定元素。常用的方法有几种:最简单的方法,使用下标:ArrayListal=newArrayList();al.add("a");al.add("b");//al.add("b");//al.add("c");//al.add("d");for(inti=0;i0)System.arraycopy(elementData,index+1,elementData,index,numMoved);elementData[--size]=null;//cleartoletGCdoitswork}可以看到删除元素时modCount增加了1,但是expectModCount没有增加。所以在使用迭代器遍历下一个元素时,会抛出异常。那么如何解决这个问题呢?其实使用迭代器本身的delete方法是没有问题的ArrayListal=newArrayList();al.add("a");al.add("b");al.add("b");al。add("c");al.add("d");Iteratoriter=al.iterator();while(iter.hasNext()){if(iter.next().equals("a")){iter.remove();}}查看迭代器本身的delete方法,不出所料,每次删除后,expectedModCount都会变成modCount。这样就不会抛出异常publicvoidremove(){if(lastRet<0)thrownewIllegalStateException();checkForComodification();try{ArrayList.this.remove(lastRet);cursor=lastRet;lastRet=-1;expectedModCount=模数;}catch(IndexOutOfBoundsExceptionex){thrownewConcurrentModificationException();}}建议以后操作集合元素时尽量使用迭代器。但是还有一处不明白。modCount和expectedModCount这两个变量有什么用?为什么操作时需要修改集合?为什么迭代器在获取下一个元素的时候需要判断它们是否相同呢?他们总是存在这是有道理的。其实从异常的类型上应该可以想到原因:ConcurrentModificationException。同时修改异常。看下面的例子Listlist=newArrayList();//Insertsomesamplevalues.list.add("Value1");list.add("Value2");list.add("Value3");//Gettwoiterators.Iteratorite=list.iterator();Iteratorite2=list.iterator();//指向list的第一个object,然后removeit.ite.next();ite.remove();/*seconditeratortristor删除firstobjectaswell.Theobjectdoesnotexistandthus,aConcurrentModificationExceptionisthrown.*/ite2.next();ite2.remove();同样的,也会报ConcurrentModificationException。