<强> Java集合删除元素ArrayList实例详解强>
AbstractCollection集合类中有一个删除方法,该方法为了适配多种不同的集合,允许删除空的元素,看这部分代码的时候产生了疑问,为什么这里直接用拔除()就直接删除了?
公共逻辑删除对象(o) { Iterator它=iterator (); 如果(o==null) { 而(it.hasNext ()) { 如果(it.next ()==null) { 拔除(); 返回true; } } 其他}{ 而(it.hasNext ()) { 如果(o.equals (it.next ())) { 拔除(); 返回true; } } } 返回错误; } >之前 接下来,拿ArrayList为例子,进行说明。其继承结构如下图所示,并且,ArrayList内部有其使用的迭代器的实现类。
编写一段测试代码:
AbstractCollection,列表=new ArrayList<的在(); list.add (“a”); list.add(空); list.add(空); Iterator iter=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实例详解