集合的删除

1:对集合中的元素直接进行遍历删除时,会报一下错误:出现了

Exception in thread "main" java.util.ConcurrentModificationException

at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)

at java.util.ArrayList$Itr.next(ArrayList.java:791)

at TestDeleteList.main(TestDeleteList.java:21)

的异常.

为什么会出现这个异常?。如果

删除的不是

”bbb”,

而是

”ddd”,

(倒数第二个)则不会产生异常。

2:对集合进行删除,不会出现异常

List<String> list =new ArrayList<String>();

list.add("aaa");

list.add("bbb");

list.add("ccc");

list.add("ddd");

list.add("eee");

list.add("fff");

list.add("ggg");

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

String str = list.get(i);

if(str.equals("eee")){

list.remove(str);

}

}

}

不会发生异常的原因是,这里没有涉及迭代器,也没有对集合是否发生改变进行判断,所以不会发生异常!

3:使用迭代器删除,不会抛出异常

for(Iterator<String> it=list.iterator();it.hasNext();){

String str=it.next();

if("bbb".equals(str)){

it.remove();//使用迭代器删除,不会抛出异常

}

}

使用迭代器进行删除,一切正常。查看迭代器的源代码(AbstractList 类中的Itr内部类)中的remove方法:

lastRet在Itr内部类中定义,表示最后操作的元素的索引号,每次迭代器的next方法执行之后,lastRet的值都会加1,但是一旦迭代器执行了remove方法之后,lastRet被重新赋值为-1,expectedModCount与modCount被更新成相等。所以迭代器在执行next方法的时候,调用checkForComodfification()进行检查的时候,不会抛出异常。

总结

对集合进行删除的时候,是否抛出ConcurrentModificationException异常,与使用哪个remove方法有关系。如果使用的是集合对象的remove方法,modCount的值就会改变,此时通过迭代器的next方法获取元素,就会进行检查,此时就会抛出异常。如果使用的是迭代器的remove方法,则不会改变modCount的值,通过迭代器next方法元素的时候,不会抛出异常。 所以对于在对集合进行迭代的时候删除其中的元素,最好使用迭代器的remove方法进行删除

时间: 2024-10-10 03:09:45

集合的删除的相关文章

双链集合添加删除算法

双链集合添加删除算法: package com.linkes; public class MyLinkeList { /** * 更多资料欢迎浏览凯哥学堂官网:http://kaige123.com * @author 小沫 */ /** * 链表集合他是于双链条式进行引用上下家,好处可以知道上家和下家是谁 * 利于修改,可以从首部开始删除数据也可以从尾部删除. * 即可从中间指定位置删除. */ private Object[] shou; private Object[] wei; // 默

多线程14-遍历集合时删除元素问题分析

1. 问题 创建一个User类: package cn.itcast.heima2; public class User implements Cloneable{ private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } public boolean equals(Object obj) { if(this == obj) { ret

如何从List集合中删除对象

这个问题看似好像挺简单挺幼稚的,然而就这个幼稚的问题还曾经困扰过我一阵呢,其实犯这个错误的根本原因是我们对于基础知识的理解和掌握上还有不足的表现,基本功有些人总是觉得不重要,认为更多的扩大学习的广度才是最重要的,我认为这是很容易犯的,同时也是很致命的错误观点! 对基础知识掌握不牢靠,或理解不深刻,写出的代码必然会有40%的概率是错误的.低效的,一段代码不是说没有编译错误就一定是对的,不是说简单的运行下就一定是对的,优秀的代码,是经得起"刀山火海"般的考验的("多线程.效率.安

Java迭代器问题 有100个人围成一个圈从1开始报数,报到14的这个人就要退出,然后其他人重新开始,从1报数,到14退出问:最后剩下的是100人中的第几个人 用listIterator迭代元素,并对集合进行删除操作

package com.swift; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class ListIterator_baoshu14 { public static void main(String[] args) { /* * 第9题: 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出. * 然后其他人重新开始,从1报数,到14退出.问:最后剩

not(expr|ele|fn)从匹配元素的集合中删除与指定表达式匹配的元素

not(expr|ele|fn) 概述 从匹配元素的集合中删除与指定表达式匹配的元素 参数 exprStringV1.0 一个选择器字符串.深圳dd马达 elementDOMElementV1.0 一个DOM元素 function(index)FunctionV1.4 一个用来检查集合中每个元素的函数.this是当前的元素. 示例 描述: 从p元素中删除带有 select 的ID的元素 HTML 代码: <p>Hello</p><p id="selected&quo

Mongodb(2)创建数据库,删除数据库,创建集合,删除集合,显示文档内容

显示所有数据库列表:show dbs > show dbs local 0.078GB runoob 0.078GB > 显示当前数据库:db > db runoob > 显示所有集合:show collections  --显示当前数据库的所有集合 > show collections col_1 col_2 runoob system.indexes > 创建数据库:use DataBase_Name  --创建名字为DataBase_Name的数据库,并切换到创建

java集合遍历删除指定元素异常分析总结

在使用集合的过程中,我们经常会有遍历集合元素,删除指定的元素的需求,而对于这种需求我们往往使用会犯些小错误,导致程序抛异常或者与预期结果不对,本人很早之前就遇到过这个坑,当时没注意总结,结果前段时间又遇到了这个问题,因此,总结下遍历集合的同时如何删除集合中指定的元素: 1.错误场景复原 public class ListRemoveTest { public static void main(String[] args) { List<User> users = new ArrayList&l

集合循环删除问题-报错java.util.ConcurrentModificationException解析

java.util.ConcurrentModificationException 异常问题详解 环境:JDK 1.8.0_111 在Java开发过程中,使用iterator遍历集合的同时对集合进行修改就会出现java.util.ConcurrentModificationException异常,本文就以ArrayList为例去理解和解决这种异常. 一.单线程情况下问题分析及解决方案 1.1 问题复现 先上一段抛异常的代码. 1 public void test1() { 2 ArrayList

python 之集合的删除

删除指定的元素 A={'a','c','b','d','e'} print("原集合:",A) A.remove('a') # 不存在会报错 print("删除a后:",A) A.discard('b') # 不存在不会报错 print("删除b后:",A) A.pop() print("删除第1个:",A) A.clear() print("清空后:",A) 删除集合A与序列B的重复元素 A={1,2,3