有问题的写法:

    private static void remove() {List<Integer> list = new ArrayList<>();for (int i = 0; i < 10; i++) {list.add(i);}int size = list.size();for (int i = 0; i < size; i++) {System.out.println(list.get(i));list.remove(i);}}

报错如下:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 5, Size: 5at java.util.ArrayList.rangeCheck(ArrayList.java:659)at java.util.ArrayList.get(ArrayList.java:435)at com.xinyu.test.TestArrayRemove.extracted(TestArrayRemove.java:22)at com.xinyu.test.TestArrayRemove.main(TestArrayRemove.java:10)

没有问题的写法:

    private static void remove2() {List<Integer> list = new ArrayList<>();for (int i = 0; i < 10; i++) {list.add(i);}Iterator<Integer> iterator = list.iterator();while (iterator.hasNext()) {Integer next = iterator.next();System.out.println(next);iterator.remove();}}

为什么Iterator可以?看下 ArrayList Iterator 源码

    private class Itr implements Iterator<E> {int cursor;       // index of next element to returnint lastRet = -1; // index of last element returned; -1 if no suchint expectedModCount = modCount;Itr() {}public boolean hasNext() {return cursor != size;}@SuppressWarnings("unchecked")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];}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();}}final void checkForComodification() {if (modCount != expectedModCount)throw new ConcurrentModificationException();}}

因为每次调用remove之后,size 会更新,调用hasNext 的时候,都会判断一下当前的cursor 和 size 是不是相等,也就是判断一下当前容器里面是不是还有元素,所以不会出现IndexOutOfBoundsException.

以下方法也可以正常运行:

    private static void remove3() {List<Integer> list = new ArrayList<>();for (int i = 0; i < 10; i++) {list.add(i);}int size = list.size();for (int i = 0; i < size; i++) {System.out.println(list.get(i));list.remove(i);size = list.size();}}

这种方法也可以,相对于Iterator 就显得比较菜,每次删除之后,就更新一下size。

List遍历过程中删除数据相关推荐

  1. List与Map的遍历过程中删除元素

    在日常的开发过程中,经常需要对List或Map里面的符合某种业务的数据进行删除,但是如果不了解里面的机制就容易掉入"陷阱"导致遗漏或者程序异常. List遍历过程中删除元素 使用索 ...

  2. 我可以从iOS DeviceSupport中删除数据吗?

    本文翻译自:Can I delete data from iOS DeviceSupport? After going through and cleaning my disk with old th ...

  3. 在DataList控件中删除数据记录

    (一)在DataList控件中删除记录的设计要点 在DataList控件中删除数据记录的设计相对简单一点.该功能设计的重点在于当用户单击[删除]按钮时,程序如何判断要删除的是哪一行.使DataList ...

  4. Oracle中删除数据的一个小技巧

    在我带的某个Project中,在开发阶段需要Reload相同的Data到Oracle中来进行测试,因此需要不断的删除数据,简单的Delete操作似乎就OK了,但其实不然.我们到知道建表的时候需要Tab ...

  5. .Net中删除数据前进行外键冲突检测

    在编写数据库系统中为了保证系统中数据的一致性最简便且安全的方法就是在DBMS中建立外键约束,但删除主键数据时如果违反了外键约束,尽管DBMS会给出错误提示,如SQL Server的提示信息" ...

  6. Android 第十五课 如何使用LitePal从SQLite数据库中删除数据(十四课用来保留讲解如何向SQLite数据库中存入数据)

    使用LitePal删除数据的方式主要有两种,第一种就是直接调用已存对象的delete()方法,所谓已存储对象就是调用过save()方法的对象,或者说是通过LitePal提供的查询API查出来的对象,都 ...

  7. 从链表中删除数据的时间复杂度真的是O(1)吗?

    本文经授权转载自微信公众号:小争哥(xiaozhengge0822),作者:小争哥 数组和链表作为最基础的数据结构,在面试的时候,经常会被问到.最常被问到的一个问题,那就是,对比一下数组和链表.如果你 ...

  8. jsp在mysql中删除数据_如何在jsp页面中删除数据库中的数据

    如何在jsp页面中删除数据库中的数据 各位大虾! 我想在jsp页面上写一个按钮功能,从而动态的删除数据库中的一行数据. 不知道怎么实现 这是我写的一段代码 数据库是MySql UserBean p3= ...

  9. GDAL书籍中删除数据勘误(C#语言)

    GDAL书籍中关于C#版本删除数据的时候,不能完全删除数据,由于我对C#不了解导致代码有点问题,非常感谢@Bingoyin指出并给出修改方案.此外对于栅格图像的删除.重命名,矢量数据的删除和重命名都有 ...

最新文章

  1. LAMP高级环境实战
  2. (原創) 如何正確的使用迴圈(使用for_each)? (C/C++) (STL) (template)
  3. 数据结构-荷兰国旗问题
  4. 隐藏基于对话框的MFC应用程序窗口的方法
  5. MQ 的本质是什么呢?
  6. Gartner磁盘阵列魔力象限:华为、昆腾、Infinidat势头迅猛
  7. 软件测试第八次作业—— 缺陷管理(含缺陷管理工具的配置实验)
  8. 云计算的基础设施服务
  9. 2015年上海现场赛重现 (A几何, K暴力搜索)
  10. 大理大学日常作业计算机基础知识,大理学院成人高等教育大学计算机基础课程作业.doc...
  11. mysql 5.7 主主配置文件_MySQL 5.7主主备份配置
  12. php学习redis买什么书,redis
  13. Quartz在QRTZ_JOB_DETAILS表中存储了什么
  14. vs2017.NET智能提示的英文改为中文
  15. 活动总曝光超1亿,单场引导GMV超1000万,华少快手生活服务专场首战告捷!
  16. 浅析瞬态抑制二极管双向tvs管
  17. 思科防火墙NAT——实验
  18. 正定矩阵的相关性质,凸锥
  19. 基于jsp的职工年终考核分数计算
  20. C++ 虚函数、虚析构、虚构造(原创纯手码)

热门文章

  1. php 进度条百分比算法,实例讲解Ajax实现简单带百分比进度条
  2. flutter ios打包_Flutter项目之iOS应用的打包发布流程
  3. linux查看python环境变量_Linux中的Python环境变量
  4. python界面是什么样子的图片_如何在python界面显示图片
  5. 5分钟搞定开机引导界面
  6. Ubuntu 防火墙配置小记
  7. Python之数据聚合与分组运算
  8. mac os 系统密码正确的 但是进不了系统
  9. EasyUI——常见用法总结
  10. JSON字符串的解析