有时候我们在遍历map集合或list集合时经常会出现如下异常:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at com.test.Test.main(Test.java:34)
比如在遍历map集合时如下实例:
package com.test;
import java.util.ArrayList;
import java.util.List;
import com.bean.Person;
public class Test {
public static void main(String[] args) {
List<Person> l=new ArrayList<Person>();
Person p=new Person(2, "lisi");
Person p0=new Person(2, "lisi1");
Person p3=new Person(2, "lisi1");
Person p1=new Person(3, "lisi2");
Person p2=new Person(4, "lisi3");
l.add(p2);
l.add(p1);
l.add(p0);
l.add(p);
l.add(p3);
List<Person> l1=new ArrayList<Person>();
for (Person person : l) {
if(person.getPname().equals("lisi1")){
l.remove(person);
}
}
for (Person person : l) {
System.out.println(person);
}
}
运行后会出现上述异常;
解决方案:
原因是在遍历一个map集合时,对容器中的数据进行数量的增加和减少惭怍就会抛出该异常;主要的原因是:当在遍历一个map容器时,此时map中的数量已经个数已经赋值给一个变量exceptionModCount,在调用next()方法时,会先比较该变量的值与容器中的实际个数modeCount的值是否相等,若二者不相等,则会抛出ConcurrentModificationException异常,因此在使用容器遍历时,如果对容器进行增加或删除操作,就会改变容器中对象的数量,从而导致抛出异常。解决方法如下:在遍历的过程中把需要删除的对象先保存在一个集合中,等遍历结束后在调用removeAll()方法来删除。
具体实现的方式:
package com.test;
import java.util.ArrayList;
import java.util.List;
import com.bean.Person;
public class Test {
public static void main(String[] args) {
List<Person> l=new ArrayList<Person>();
Person p=new Person(2, "lisi");
Person p0=new Person(2, "lisi1");
Person p3=new Person(2, "lisi1");
Person p1=new Person(3, "lisi2");
Person p2=new Person(4, "lisi3");
l.add(p2);
l.add(p1);
l.add(p0);
l.add(p);
l.add(p3);
List<Person> l1=new ArrayList<Person>();
for (Person person : l) {
if(person.getPname().equals("lisi1")){
l1.add(person);
}
}
l.removeAll(l1);
for (Person person : l) {
System.out.println(person);
}
}
}
修改后运行正确: