java集合的遍历删除。

案例

  1. 使用普通for循环遍历集合

       //以下代码不会有任何问题List<Integer> list = new ArrayList();list.add(1);list.add(2);list.add(3);int listSize = list.size();for (int i = 0; i < listSize; i++) {iterator.remove();//或者 list.remove(0);或者使用,list.remove(list.get(0));}System.out.println(list.size());
    
  2. 当你使用集合的forEach()遍历集合时,

    //这里会报异常: java.util.ConcurrentModificationException   List<Integer> list = new ArrayList();list .add(1);list.add(2);list.add(3);for (Integer integer : list) {list.remove(integer);}
    

    这是因为forEach底层用的是iterator迭代器

  3. 当使用iterator迭代器遍历集合时

            List<Integer> integerList=new ArrayList<>();Iterator<Integer> iterator = integerList.iterator();while (iterator.hasNext()){Integer integer=iterator.next();integerList.remove(integer);//这个方式移除,报异常java.util.ConcurrentModificationException  iterator.remove(); //用这个方式没有问题}
    

    原因:

    这里查看ArrayList实现iterator的源码,注意iteratornext()和remove()方法。
    你会发现,iteratornext()和remove()方法,都调用了checkForComodification(),当ArrayListmodCount (修改次数)!= expectedModCount(迭代器修改次数)时,会抛异常,当你调用iteratorremove()方法,会同步两个修改次数,而ArrayList不会同步,所以会抛异常

      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();}}@Override@SuppressWarnings("unchecked")public void forEachRemaining(Consumer<? super E> consumer) {Objects.requireNonNull(consumer);final int size = ArrayList.this.size;int i = cursor;if (i >= size) {return;}final Object[] elementData = ArrayList.this.elementData;if (i >= elementData.length) {throw new ConcurrentModificationException();}while (i != size && modCount == expectedModCount) {consumer.accept((E) elementData[i++]);}// update once at end of iteration to reduce heap write trafficcursor = i;lastRet = i - 1;checkForComodification();}final void checkForComodification() {if (modCount != expectedModCount)throw new ConcurrentModificationException();}}

java集合的遍历删除相关推荐

  1. Java集合如何遍历删除指定元素

    目录 1.删除List 2.删除Set 3.删除Map 注意事项: 1.删除List public class ListDemo {public static void main(String[] a ...

  2. Java 集合List遍历删除

    循环遍历需要从最后索引开始!!! public static void main(String[] args) {List<Integer> list = new ArrayList< ...

  3. Java 集合中遍历删除元素抛异常的原因,从ArrayList说起

    文章目录 使用for删除遗漏元素的原因: 使用foreach删除报错的原因: 其它集合的删除方法 删除集合元素的工具类 ArrayList删除元素的方式. 使用for循环删除.会遗漏删除的元素 使用f ...

  4. java中List遍历删除元素

    删除末尾几个元素 import java.util.LinkedList; import java.util.List;public class TestList {public static voi ...

  5. Java集合中元素删除

    在Java中删除集合中元素时,需要特别注意,一方面是因为,Java是并发编程语言,如果存在并发操作,则会出现逻辑异常:另一方面,在List中删除元素,如果操作不当,则会抛出异常. 阿里推出的<J ...

  6. JAVA集合迭代遍历和特性介绍

    数组.集合:都是一种容器,用一个对象管理多个对象:数组不能自动增长:只能存放同类型的元素 集合能自动扩容:部分集合允许存放不同类型的元素: 1.List: 有顺序的,允许存放重复的元素: 遍历:for ...

  7. java集合的遍历_Java集合之遍历

    在Java开发中,集合,可以说使我们必然要使用到的一个框架.对集合的遍历也是我么经常要进行的操作,而遍历操作又有多种,下面就对集合遍历进行以下总结. 一.List.Set的遍历 List与Set都继承 ...

  8. java中List遍历删除元素,Android进阶之光

    一.结缘 实话说,最开始刷题的时候,刷的是 LeetCode,后来才注意到了剑指 offer 的存在,最开始也是听别人说的,剑指 offer 在面试过程中出现的概率很大,就去尝试将其都做了一遍,做的过 ...

  9. java集合的遍历_java集合遍历方法总结

    java集合遍历方法总结 一.for循环遍历集合 使用条件: ①能否确定集合中的元素个数 ②集合是否可以通过整数索引值来精确位置 public static void forTraversal(){ ...

最新文章

  1. mqttjar包_GitHub - a-voyager/MqttLib: Mqtt 通信封装库.
  2. 企业云部署要如何选择IaaS PaaS和SaaS
  3. mpp新增一个字段_如何快速新增百万测试数据?
  4. mysql高级查询面试_高级MySQL数据库面试问题 附答案
  5. 神经网络初始化trick:大神何凯明教你如何训练网络!
  6. QT5开发及实例学习之一main()函数相关内容介绍
  7. UVa 1347 旅行
  8. Hive中数据的导入与导出
  9. *.pro、*.pri、*.prf、*.prl等四种文件
  10. pdf2image安装
  11. opencv 毛星云c++版本复习
  12. 【光斑PSF处理】激光光斑数据处理含matlab源码-含文档【0102期】
  13. 然而大部分工程师的期权并没有什么用
  14. 404是什么意思,404错误页面有什么用?
  15. IOS开发之——QQ主流框架(64)
  16. python爬取微博评论并做词频分析_爬取李子柒微博评论并分析
  17. 家用计算机按键不灵怎么修,电脑键盘两个ctrl键失灵怎么回事?ctrl键失灵的修复方法...
  18. Python抓取某东电商平台数据
  19. 计算机网络资料整理《谢希仁版》
  20. windows下tomcat集群配置(两种方法)

热门文章

  1. 李晓宁--我的东西方思想方法观
  2. 【论文笔记】Shunted Self-Attention via Multi-Scale Token Aggregation 论文笔记及实验
  3. 卡扣服务器添加显示不出来,百叶窗卡扣安装方法图解 老师傅教你怎么安装百叶窗...
  4. c#水晶报表连接mysql_C# 用vs2008连接SQL数据库做动态水晶报表
  5. 关于企业中网络安全建设的一些心得
  6. 如何轻松录制 CS 游戏玩法?4 种免费录制 CS 游戏视频的方法
  7. 兰切斯特第二法则与动能定理
  8. python 判断奇数偶数
  9. 解决方案:Win10和Linux双系统配对蓝牙设备
  10. Shiro整合SSO单点登录系统