java.util.ConcurrentModificationException错误的解决方法

首先模拟这个错误的发生场景。

public void list(){
  List testList = new ArrayList();
       int a =1;
       int b =2;
      int c =3;
    testList.add(a);
    testList.add(b);
    testList.add(c);
  for(Object o :testList){
     if(Integer.valueOf(o.toString())>2){
        testList.remove(o);
     }
   }
 }

这个错误的场景是,在遍历List集合的时候,有一个判断,符合条件之后调用list的remove方法,将这个元素从List里清除掉。

我们跟踪调试,发现错误是在调用Remove方法这一行。错误的原因是什么呢?

我们知道集合的存储结构是单向链表,就是在内存中一个元素占用一小块内存,这一小块内存分两部分,一部分存储元素本身,另一部分存储下一个元素的地

址,在进行循环遍历的时候,程序会给这个循环加上一个mutex锁,进行remove操作之后,根据上一个元素查找下一个元素的地址,查找不到,结果就报上面的

错误。

这个错误该怎么解决呢?有两个解决方案。

第一种:既然他在进行遍历的时候会加锁,我不进行循环不就行了。采用最原始的迭代方法,如下

for(int i =0;i

Object o =testList.get(i);

               if(Integer.valueOf(o)){

                 testList.remove(i);

   }

}

第二种:如果我还是想用上面的迭代方法怎么办呢。凉拌。

错误是在remove方法这一行报错的。我可以把要remove的元素放到一个List集合里面,在循环完成之后再进行移除。如下:

  List test    List 1= new ArrayList();
for(Object o :testList){

     if(Intege.valueOf(o)){

             list1.add(o);

  }

//完成迭代之后

testList.removeAll(list1);

}

这样就不会引起错误 了。

 

 

 

 

 

 

 

 

你可能感兴趣的:(javase)