博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
遍历List 同时 remove 元素
阅读量:6835 次
发布时间:2019-06-26

本文共 1105 字,大约阅读时间需要 3 分钟。

hot3.png

[java] 

  1. List<Integer> list = new ArrayList<Integer>();  

  2. list.add(1);  

  3. list.add(2);  

  4. list.add(3);  

  5. list.add(4);  

  6. list.add(5);  

  7. list.add(6);  

  8.   

  9. for (Iterator<Integer> iter = list.iterator(); iter.hasNext();)  

  10. {  

  11.     int i = iter.next();  

  12.     if (i == 3)  

  13.     {  

  14.         list.remove(i);  

  15.     }  

  16. }  

运行上边的代码就会报错:

API中此异常的解释:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。

原因:

Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。

所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。

网上找的解决方法:

1.倒过来遍历list

[java] 

  1. for (int i = list.size()-1; i >=0; i--)  

  2. {  

  3.     int item = list.get(i);  

  4.     if (item == 3)  

  5.     {  

  6.         list.remove(item);  

  7.     }  

  8. }  

2.每移除一个元素以后再把i移回来

[java] 

  1. for (int i = 0; i < list.size(); i++)   

  2. {  

  3.     int item = list.get(i);  

  4.     if (item == 3)  

  5.     {  

  6.         list.remove(item);  

  7.         i=i-1;  

  8.     }  

  9. }  

3.使用iterator.remove()方法删除

[java] 

  1. for (Iterator<Integer> iter = list.iterator(); iter.hasNext();)  

  2. {  

  3.     int item = iter.next();  

  4.     if (item == 3)  

  5.     {  

  6.         iter.remove();  

  7.     }  

  8. }  

转载于:https://my.oschina.net/bv10000/blog/187576

你可能感兴趣的文章
JUnit 5发布
查看>>
为DevOps正确组合IT、文化和实践
查看>>
苹果推出开源医学研究框架ResearchKit
查看>>
如何在 Kubernetes 中对无状态应用进行分批发布
查看>>
图片即时优化的三种简单解决方案
查看>>
Eclipse发布MicroProfile 1.4和2.0
查看>>
Netflix发布Polly.JS,一个用于HTTP交互的开源库
查看>>
php生成sitemap
查看>>
AWS 开源 SageMaker,帮助开发人员优化机器学习模型
查看>>
NumSharp v0.8.0 发布,C# 张量计算库
查看>>
linux shell (4) - Loop 循环
查看>>
JFinal-layui v1.2.3 发布,极速开发企业应用系统
查看>>
GitLab 已迁移至谷歌云平台,并表示目前运行良好
查看>>
python Day1作业:用户三次登陆锁定
查看>>
镜像即代码:基于Packer构建阿里云镜像
查看>>
pg_dump 详解/使用举例
查看>>
云栖社区 测试技术社区大群 正式成立!还在等什么,快来加入我们 ...
查看>>
spring cloud微服务分布式云架构-Gateway入门
查看>>
python编程语言基础
查看>>
Java面试笔试题大汇总三(最全+详细答案)
查看>>