欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

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

时间:2021-12-30 10:29:10|栏目:JAVA代码|点击:

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

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

public boolean remove(Object o) {
    Iterator<E> it = iterator();
    if (o==null) {
      while (it.hasNext()) {
        if (it.next()==null) {
          it.remove();
          return true;
        }
      }
    } else {
      while (it.hasNext()) {
        if (o.equals(it.next())) {
          it.remove();
          return true;
        }
      }
    }
    return false;
  }

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

编写一段测试代码:

AbstractCollection<String> list = new ArrayList<>();
    list.add("a");
    list.add(null);
    list.add(null);

    Iterator<String> iter = list.iterator();
    while(iter.hasNext()) {
      if(iter.next() == null) {
        iter.remove();
      }
    }
    System.out.println(list);

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

 public E next() {
      checkForComodification();
      int i = cursor;
      if (i >= size)
        throw new NoSuchElementException();
      Object[] elementData = ArrayList.this.elementData;
      if (i >= elementData.length)
        throw new ConcurrentModificationException();
      cursor = i + 1;
      return (E) elementData[lastRet = i];
    }

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

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

  public void remove() {
      if (lastRet < 0)
        throw new IllegalStateException();
      checkForComodification();

      try {
        ArrayList.this.remove(lastRet);
        cursor = lastRet;
        lastRet = -1;
        expectedModCount = modCount;
      } catch (IndexOutOfBoundsException ex) {
        throw new ConcurrentModificationException();
      }
    }

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

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

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

上一篇:Spring Boot应用开发初探与实例讲解

栏    目:JAVA代码

下一篇:mybatis spring配置SqlSessionTemplate的使用方式

本文标题:Java集合删除元素ArrayList实例详解

本文地址:http://www.codeinn.net/misctech/188498.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有