List 删除指定元素

List 删除指定元素由于 jdk1 5 推出了快速便利 foreach 我们在编码过程中便利都是 foreach 格式如下 for Objecto objList 现在的场景是 需要删除 objList 中的某几个元素 自然而然 我们会习惯性的写下如下语句 inti 0 for Objecto objList if o value

由于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             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             it = intList.iterator(); while(it.hasNext()) { if(it.next() == 13) { it.remove(); } }      










版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/206983.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午3:03
下一篇 2026年3月19日 下午3:03


相关推荐

  • vue项目实现路由按需加载(路由懒加载)的3种方式

    vue项目实现路由按需加载(路由懒加载)的3种方式为什么需要懒加载 像 vue 这种单页面应用 如果没有应用懒加载 运用 webpack 打包后的文件将会异常的大 造成进入首页时 需要加载的内容过多 时间过长 会出啊先长时间的白屏 即使做了 loading 也是不利于用户体验 而运用懒加载则可以将页面进行划分 需要的时候加载页面 可以有效的分担首页所承担的加载压力 减少首页加载用时 vue 异步组件 es 提案的 import webpack

    2026年3月20日
    2
  • 回溯法解01背包问题_01背包问题回溯法伪代码

    回溯法解01背包问题_01背包问题回溯法伪代码一、问题n皇后问题的解空间树是一颗排列树,而01背包问题的解空间树应该是一颗子集树。再简述下该问题:有n件物品和一个容量为c的背包。第i件物品的价值是v[i],重量是w[i]。求解将哪些物品装入背包可使价值总和最大。所谓01背包,表示每一个物品看成一个整体,要么全部装入,要么都不装入。这里n=5,c=10,w={2,2,6,5,4},v={6,3,5,4,6}。01背…

    2022年8月30日
    4
  • linux pmap命令,linux中 pmap 命令详解

    linux pmap命令,linux中 pmap 命令详解通过查看帮助 返回了如下信息 Usage pmap options pid pid Options x extendedshow Xshowevenmor formatchange proc PID smaps XXshow

    2026年3月17日
    2
  • 在vue中使用tinymce富文本编辑器+tinymce富文本编辑器插入图片

    在vue中使用tinymce富文本编辑器+tinymce富文本编辑器插入图片1.安装#npminstalltinymce-S2.把node_modules\tinymce里面的文件包括tinymce文件夹全部复制到static文件夹下面,如下图3.在mian.js中引入tinymce(也可以在组件中引入)importTinymcefrom’tinymce’Vue.prototype.$tinymce=Tinymce…

    2022年5月1日
    84
  • css设置table样式_table的样式怎么设置

    css设置table样式_table的样式怎么设置漂亮的table表格样式css源码漂亮的table表格样式css源码&lt;head&gt;&lt;title&gt;&lt;/title&gt;&lt;styletype="text/css"&gt;table{border-collapse:collapse;margin:0…

    2026年1月29日
    5
  • jaccard系数怎么计算例子_装甲车系数与距离关系

    jaccard系数怎么计算例子_装甲车系数与距离关系Jaccard(杰卡德)系数主要用于计算样本间的相似度。Jaccard系数的计算方式为:样本交集个数和样本并集个数的比值,用J(A,B)表示。公式为:这里写图片描述jaccard系数相反的即为jacc

    2022年8月2日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号