List 删除指定元素
由于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.
Iterator的工作机制:
Iterator是工作在一个独立的线程中,并且拥有一个 mutex锁,就是说Iterator在工作的时候,是不允许被迭代的对象被改变的。Iterator被创建的时候,建立了一个内存索引表(单链表),这 个索引表指向原来的对象,当原来的对象数量改变的时候,这个索引表的内容没有同步改变,所以当索引指针往下移动的时候,便找不到要迭代的对象,于是产生错 误。List、Set等是动态的,可变对象数量的数据结构,但是Iterator则是单向不可变,只能顺序读取,不能逆序操作的数据结构,当 Iterator指向的原始数据发生变化时,Iterator自己就迷失了方向。
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 删除指定元素相关推荐
- Redis中有序集合zset数据类型(增加(添加元素)、获取(获取指定范围元素、返回权值在min和max之间的成员、返回成员member的score值)、删除(删除指定元素和指定权值范围的元素))
sorted set,有序集合 元素为string类型 元素具有唯⼀性,不重复 [值不能重复] 每个元素都会关联⼀个double类型的score,表示权重,通过权重将元素从⼩到⼤排序 说明:没有修 ...
- Redis中集合set数据类型(增加(添加元素)、获取(获取所有元素)、删除(删除指定元素))
⽆序集合 元素为string类型 元素具有唯⼀性,不重复 说明:对于集合没有修改操作 [没有更新功能][应用:购物车中会用到] 1. 增加 1.1 添加元素 sadd key member1 memb ...
- Redis中列表list数据类型(增加(在左侧、右侧或指定元素前后插入数据)、获取(获取表内指定范围的元素)、更新(获取指定索引位置的元素值)、删除(删除指定元素、count))
列表的元素类型为string 按照插⼊顺序排序 1. 增加 1.1 在左侧插⼊数据 lpush key value1 value2 ... 例1:从键为a1的列表左侧加⼊数据a . b .c lpus ...
- C++ vector容器 find erase的使用:查找并删除指定元素
概念:容器.迭代器.算法 STL包括容器.迭代器和算法: 容器 用于管理一些相关的数据类型.每种容器都有它的优缺点,不同的容器反映出程序设计的不同需求.容器自身可能由数组或链表实现,或者容器中的每个元 ...
- js list删除指定元素_删除js数组中的指定元素,有这两步就够了
js数组是js部分非常重要的知识,有时我们有这么个需求js数组删除指定元素,先定义一个函数来获取删除指定元素索引值,然后用js数组删除的方法,来删除指定元素即可,就两步不难,很简单. 1.JS的数组对 ...
- 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 ...
- vector删除指定元素
C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法. C++ 中std::remove()并不删除元素,因为容器的size()没有变化,只是元素的 ...
- C/C++ vector 删除指定元素
C++ vector 删除符合条件的元素 C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法. C++ 中std::remove()并不删除元素, ...
- 链表删除指定元素算法
链表删除指定元素算法 我们只需要分情况理清楚就很简单 在算法分析的时候记清楚自己的思路是最重要的 只要链表里有一个元素与给定的元素不相同 第一次与给定元素不相同的节点就为头节点 1:改变头节点 2:不 ...
- js数组怎么删除指定元素?
js数组是js部分非常重要的知识,有时我们有这么个需求js数组删除指定元素,先定义一个函数来获取删除指定元素索引值,然后用js数组删除的方法,来删除指定元素即可,就两步不难,很简单. 1.JS的数组对 ...
最新文章
- 关于学习Python的一点学习总结(45->反运算)
- asp从后台调出的公式怎么参与运算_Excel中使用公式老是出错,这几招帮你轻松解决~...
- java 重用性_Java开发重用性必备的三大核心知识点
- 离线安装宝塔lnmp_宝塔LNMP环境 Nginx安装EduSoho教程说明
- 链表创建、逆置、删除详解
- 信息学奥赛一本通(1030:计算球的体积)
- 01串(51Nod-1391)
- MongoDB(window安装及服务配置)
- 英特尔发布年度企业社会责任报告,首次定义“全球性挑战”
- Spring-自定义BeanName生成规则
- VS2017 离线安装vsix插件
- 【游戏开发实战】2D游戏摄像机镜头跟随,屏幕边缘限制镜头移动(使用Cinemachine组件)
- java库存同步思路_这个是真的厉害,高并发场景下的订单和库存处理方案,讲的很详细了!...
- 微信JSAPI几个函数介绍
- 新手必看--test link使用步骤
- 第二部分 音频压缩编码
- 如何解决因网络问题导致的 github 下载出错
- 萌新的ACM三月训练总结
- 为 setuptools 开路搭桥
- 图片怎么加水印?图片加水印用什么软件?