Java集合删除元素ArrayList实例详解

  

<强> Java集合删除元素ArrayList实例详解

  

AbstractCollection集合类中有一个删除方法,该方法为了适配多种不同的集合,允许删除空的元素,看这部分代码的时候产生了疑问,为什么这里直接用拔除()就直接删除了?

        公共逻辑删除对象(o) {   Iterator它=iterator ();   如果(o==null) {   而(it.hasNext ()) {   如果(it.next ()==null) {   拔除();   返回true;   }   }   其他}{   而(it.hasNext ()) {   如果(o.equals (it.next ())) {   拔除();   返回true;   }   }   }   返回错误;   }   之前      

接下来,拿ArrayList为例子,进行说明。其继承结构如下图所示,并且,ArrayList内部有其使用的迭代器的实现类。
  

  

癑ava集合删除元素ArrayList实例详解"

  

编写一段测试代码:

        AbstractCollection,列表=new ArrayList<的在();   list.add (“a”);   list.add(空);   list.add(空);      Iteratoriter=list.iterator ();   而(iter.hasNext ()) {   如果(iter.next ()==null) {   iter.remove ();   }   }   System.out.println(列表);      之前      

关键点还是在于iter.next()==零这一行,接下来的源码如下:

        公共E next () {   checkForComodification ();   int i=光标;   如果我在=大小)   把新NoSuchElementException ();   对象[]elementData=https://www.yisu.com/zixun/ArrayList.this.elementData;   如果(我>=elementData.length)   抛出ConcurrentModificationException ();   光标=i + 1;   返回(E) elementData [lastRet=我];   }   之前      

cusor在这里表示的是遍历时的索引,在调用一方法的时候其实cusor已经指向了当前元素的下一个元素,而使用lasrRet来获取当前的索引上的数据并将其返回。

  

而remove()方法中是通过lastRet的索引进行删除的。

        公共空间remove () {   如果(lastRet & lt;0)   把新IllegalStateException ();   checkForComodification ();      尝试{   ArrayList.this.remove (lastRet);   光标=lastRet;   lastRet=1;   expectedModCount=modCount;   }捕捉(IndexOutOfBoundsException ex) {   抛出ConcurrentModificationException ();   }   }      之前      

借助上文中提到的测试实例,可以进行每一步的推算。
  

  

1。调用next()方法,光标指向0号元素,我被赋值为指针的值,然后光标被修改我为+ 1,指向了1号元素,也就是零所在的位置,lastRet被赋值为0。
  2. 调用next()方法,光标指向了1号元素,赋值给我,然后光标又通过i + 1递增变为2,lastRet被赋值为1
  3.执行删除,删除该集合lastRet上所代表的元素。删除完成后修改光标指针同时使得expectedModCount和modCount保持一致避免fastfail。

  

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Java集合删除元素ArrayList实例详解