由于jdk 1.5推出了快速便利 for each,我们在编码过程中便利都是for each , 格式如下

for(Object o : objList)
{...
}

现在的场景是,需要删除objList中的某几个元素,自然而然,我们会习惯性的写下如下语句:

int i = 0;
for(Object o : objList)
{if(o == value){objList.remove(i); }i++;
}

这时你就会发现报  java.util.ConcurrentModificationException 异常,此异常是迭代器抛出的异常,官方说明是:

The Iterators returned by this class's iterator method are fail-fast: if the set is modified at any time after the iterator is created, in any way except through the iterator's own remove  method, the iterator will throw a ConcurrentModificationException. Thus, in the face of concurrent modification, the iterator fails quickly and cleanly, rather than risking arbitrary, non-deterministic behavior at an undetermined time in the future.
大概意思是:在用迭代器迭代集合的时候,迭代器一旦创建,就不允许更改集合,如果所迭代的集合(Set或者List)的有修改的话,就会抛出 
ConcurrentModificationException异常, 用迭代器自身的remove方法除外...
进一步说明如下:
用for-each遍历 实际上使用的是Iterator迭代器
Iterator的工作机制:
Iterator是工作在一个独立的线程中,并且拥有一个 mutex锁,就是说Iterator在工作的时候,是不允许被迭代的对象被改变的。Iterator被创建的时候,建立了一个内存索引表(单链表),这 个索引表指向原来的对象,当原来的对象数量改变的时候,这个索引表的内容没有同步改变,所以当索引指针往下移动的时候,便找不到要迭代的对象,于是产生错 误。List、Set等是动态的,可变对象数量的数据结构,但是Iterator则是单向不可变,只能顺序读取,不能逆序操作的数据结构,当 Iterator指向的原始数据发生变化时,Iterator自己就迷失了方向。
那么要删除指定的元素应该如何呢?下面是一些解决方法:
一.  用一个List 记录要删除的数据,最后removeAll(List);
List<Integer> removeList = new ArrayList()
for(Integer i : intList)
{if(i == 13){removeList.add(i);}
}
//最后
if(removeList.size()>0)
{intList.removeAll(removeList);
}

二.用for循环遍历,原始书写方式

for(int i = 0; i < intList.size(); i++)
{if(intList.get(i) == 13){intList.remove(i);//此时要注意,因为list会动态变化不像数组会占位,所以当前索引应该后退一位i--;}
}

三.用迭代器自带的remove方法,这也是官方推荐的方法

Iterator <Integer> it = intList.iterator();
while(it.hasNext())
{if(it.next() == 13){it.remove();}
}

List 删除指定元素相关推荐

  1. Redis中有序集合zset数据类型(增加(添加元素)、获取(获取指定范围元素、返回权值在min和max之间的成员、返回成员member的score值)、删除(删除指定元素和指定权值范围的元素))

    sorted set,有序集合 元素为string类型 元素具有唯⼀性,不重复   [值不能重复] 每个元素都会关联⼀个double类型的score,表示权重,通过权重将元素从⼩到⼤排序 说明:没有修 ...

  2. Redis中集合set数据类型(增加(添加元素)、获取(获取所有元素)、删除(删除指定元素))

    ⽆序集合 元素为string类型 元素具有唯⼀性,不重复 说明:对于集合没有修改操作 [没有更新功能][应用:购物车中会用到] 1. 增加 1.1 添加元素 sadd key member1 memb ...

  3. Redis中列表list数据类型(增加(在左侧、右侧或指定元素前后插入数据)、获取(获取表内指定范围的元素)、更新(获取指定索引位置的元素值)、删除(删除指定元素、count))

    列表的元素类型为string 按照插⼊顺序排序 1. 增加 1.1 在左侧插⼊数据 lpush key value1 value2 ... 例1:从键为a1的列表左侧加⼊数据a . b .c lpus ...

  4. C++ vector容器 find erase的使用:查找并删除指定元素

    概念:容器.迭代器.算法 STL包括容器.迭代器和算法: 容器 用于管理一些相关的数据类型.每种容器都有它的优缺点,不同的容器反映出程序设计的不同需求.容器自身可能由数组或链表实现,或者容器中的每个元 ...

  5. js list删除指定元素_删除js数组中的指定元素,有这两步就够了

    js数组是js部分非常重要的知识,有时我们有这么个需求js数组删除指定元素,先定义一个函数来获取删除指定元素索引值,然后用js数组删除的方法,来删除指定元素即可,就两步不难,很简单. 1.JS的数组对 ...

  6. Java 集合List、Set、HashMap操作二(Map遍历、List反向、Set删除指定元素,集合只读、TreeMap操作、List转Array、List移动元素)

    Map遍历 import java.util.Map; import java.util.HashMap; import java.util.HashSet; import java.util.Ite ...

  7. vector删除指定元素

    C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法. C++ 中std::remove()并不删除元素,因为容器的size()没有变化,只是元素的 ...

  8. C/C++ vector 删除指定元素

    C++ vector 删除符合条件的元素 C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法. C++ 中std::remove()并不删除元素, ...

  9. 链表删除指定元素算法

    链表删除指定元素算法 我们只需要分情况理清楚就很简单 在算法分析的时候记清楚自己的思路是最重要的 只要链表里有一个元素与给定的元素不相同 第一次与给定元素不相同的节点就为头节点 1:改变头节点 2:不 ...

  10. js数组怎么删除指定元素?

    js数组是js部分非常重要的知识,有时我们有这么个需求js数组删除指定元素,先定义一个函数来获取删除指定元素索引值,然后用js数组删除的方法,来删除指定元素即可,就两步不难,很简单. 1.JS的数组对 ...

最新文章

  1. 关于学习Python的一点学习总结(45->反运算)
  2. asp从后台调出的公式怎么参与运算_Excel中使用公式老是出错,这几招帮你轻松解决~...
  3. java 重用性_Java开发重用性必备的三大核心知识点
  4. 离线安装宝塔lnmp_宝塔LNMP环境 Nginx安装EduSoho教程说明
  5. 链表创建、逆置、删除详解
  6. 信息学奥赛一本通(1030:计算球的体积)
  7. 01串(51Nod-1391)
  8. MongoDB(window安装及服务配置)
  9. 英特尔发布年度企业社会责任报告,首次定义“全球性挑战”
  10. Spring-自定义BeanName生成规则
  11. VS2017 离线安装vsix插件
  12. 【游戏开发实战】2D游戏摄像机镜头跟随,屏幕边缘限制镜头移动(使用Cinemachine组件)
  13. java库存同步思路_这个是真的厉害,高并发场景下的订单和库存处理方案,讲的很详细了!...
  14. 微信JSAPI几个函数介绍
  15. 新手必看--test link使用步骤
  16. 第二部分 音频压缩编码
  17. 如何解决因网络问题导致的 github 下载出错
  18. 萌新的ACM三月训练总结
  19. 为 setuptools 开路搭桥
  20. 图片怎么加水印?图片加水印用什么软件?

热门文章

  1. 三种JS截取字符串方法
  2. 小散量化炒股记|MySQL搭建股票量化数据库完整模版来袭
  3. Doris、Clickhouse、Tidb三者对比
  4. 哪款无线耳机通话效果好?无线蓝牙耳机通话效果排名
  5. js如何用touchstart+touchend实现长按事件
  6. 常见的大数据分析方法有哪些
  7. 夸克浏览器禁止访问怎么回事?
  8. 【机器学习】逻辑回归-基础认识与鸢尾花分类实操案例
  9. CSS3轮回写轮眼制作
  10. python gil锁_python GIL锁问题