全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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。

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


# Java集合删除元素ArrayList  # java  # ArrayList  # 删除元素  # java ArrayList集合中的某个对象属性进行排序的实现代码  # java集合类arraylist循环中删除特定元素的方法  # Java中ArrayList集合的常用方法大全  # Java ArrayList集合详解(Java动态数组)  # Java的List集合框架之ArrayList详解  # 在java中ArrayList集合底层的扩容原理  # Java中的ArrayList集合源码解析  # Java ArrayList集合之解锁数据存储新姿势  # 值为  # 的是  # 在这里  # 这部  # 希望能  # 所示  # 谢谢大家  # 如下图  # 这一行  # 有一个  # 类中  # 产生了  # 完成后  # 并将其  # hasNext  # iterator  # gt  # lt  # null  # false 


相关文章: 网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  企业微网站怎么做,公司网站和公众号有什么区别?  网站制作难吗安全吗,做一个网站需要多久时间?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何做网站制作流程,*游戏网站怎么搭建?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  制作电商网页,电商供应链怎么做?  香港服务器选型指南:免备案配置与高效建站方案解析  南平网站制作公司,2025年南平市事业单位报名时间?  网站制作价目表怎么做,珍爱网婚介费用多少?  宝塔建站无法访问?如何排查配置与端口问题?  制作宣传网站的软件,小红书可以宣传网站吗?  文字头像制作网站推荐软件,醒图能自动配文字吗?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  c# 在高并发下使用反射发射(Reflection.Emit)的性能  C#如何序列化对象为XML XmlSerializer用法  如何自定义建站之星网站的导航菜单样式?  如何配置IIS站点权限与局域网访问?  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  招贴海报怎么做,什么是海报招贴?  如何在建站宝盒中设置产品搜索功能?  建站主机核心功能解析:服务器选择与网站搭建流程指南  盘锦网站制作公司,盘锦大洼有多少5G网站?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  如何高效生成建站之星成品网站源码?  如何通过网站建站时间优化SEO与用户体验?  如何制作网站标识牌,动态网站如何制作(教程)?  建站DNS解析失败?如何正确配置域名服务器?  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  如何高效搭建专业期货交易平台网站?  如何用景安虚拟主机手机版绑定域名建站?  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  在线制作视频的网站有哪些,电脑如何制作视频短片?  音乐网站服务器如何优化API响应速度?  如何用AWS免费套餐快速搭建高效网站?  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  h5在线制作网站电脑版下载,h5网页制作软件?  七夕网站制作视频,七夕大促活动怎么报名?  如何安全更换建站之星模板并保留数据?  视频网站制作教程,怎么样制作优酷网的小视频?  建站之星价格显示格式升级,你的预算足够吗?  宝塔Windows建站如何避免显示默认IIS页面? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。