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

发布时间 - 2026-01-11 00:50:28    点击率:

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 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 轻松掌握MySQL函数中的last_insert_id()  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  如何在IIS中新建站点并解决端口绑定冲突?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  ,在苏州找工作,上哪个网站比较好?  如何在万网主机上快速搭建网站?  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  如何快速辨别茅台真假?关键步骤解析  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  高端云建站费用究竟需要多少预算?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  如何在云指建站中生成FTP站点?  python中快速进行多个字符替换的方法小结  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  如何在服务器上配置二级域名建站?  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  深入理解Android中的xmlns:tools属性  如何在景安云服务器上绑定域名并配置虚拟主机?  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  JavaScript数据类型有哪些_如何准确判断一个变量的类型  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  JavaScript常见的五种数组去重的方式  进行网站优化必须要坚持的四大原则  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  如何在景安服务器上快速搭建个人网站?  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  Laravel怎么调用外部API_Laravel Http Client客户端使用  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  javascript读取文本节点方法小结  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  如何将凡科建站内容保存为本地文件?  如何在Tomcat中配置并部署网站项目?  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  网站优化排名时,需要考虑哪些问题呢?  EditPlus中的正则表达式实战(5)  Laravel如何创建自定义Facades?(详细步骤)  javascript基本数据类型及类型检测常用方法小结  javascript中对象的定义、使用以及对象和原型链操作小结  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法