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

作者:lqh 时间:2022-11-09 19:12:39 

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的实现类。

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

编写一段测试代码:


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。

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

来源:http://blog.csdn.net/wangyang1354/article/details/56843687

标签:Java,ArrayList,删除元素
0
投稿

猜你喜欢

  • 聊聊Unity 自定义日志保存的问题

    2021-11-28 15:38:55
  • Java获取视频时长、大小的示例

    2023-01-16 01:48:44
  • java 归并排序的实例详解

    2021-12-06 22:58:05
  • 详解Java注解知识点

    2021-06-24 18:39:12
  • Java 中很好用的数据结构EnumSet

    2023-12-06 09:37:23
  • 自己动手写的mybatis分页插件(极其简单好用)

    2023-11-01 18:12:09
  • Eclipse的Debug调试技巧大全(总结)

    2023-11-25 06:14:06
  • IDEA最新版2020.1的maven工程本地依赖仓库无法使用问题(已解决)

    2023-09-21 17:57:00
  • Java语言实现简单FTP软件 FTP协议分析(1)

    2023-11-10 17:57:21
  • java弹幕小游戏1.0版本

    2021-12-06 04:42:48
  • 搞懂Java线程池

    2021-08-04 10:01:06
  • springboot 整合 seata的配置过程

    2023-01-13 01:28:33
  • IP查询系统的异步回调案例

    2023-11-10 18:22:24
  • 一文搞懂Java MD5算法的原理及实现

    2023-01-04 21:10:24
  • 教你如何用好 Java 中的枚举

    2022-11-03 10:31:21
  • Flutter 分页功能表格控件详细解析

    2023-09-22 20:02:45
  • java 遍历request中的所有表单数据的实例代码

    2021-10-21 11:19:26
  • 带你了解Java Maven的打包操作

    2022-08-03 15:23:33
  • 移动开发Spring Boot外置tomcat教程及解决方法

    2023-08-25 11:47:33
  • mybatis in foreach 双层嵌套问题

    2023-11-24 12:55:47
  • asp之家 软件编程 m.aspxhome.com