java.util.ConcurrentModificationException 异常原因和解决方法
一、设计知识点:
集合中的remove()方法和迭代器Iterator的remove()方法区别。
设计引用原文链接:https://blog.csdn.net/hqqkkc/article/details/108753890。
(2条消息) java.util.ConcurrentModificationException 异常原因和解决方法_y4ung-CSDN博客
1、集合的remove
Collection c=new ArrayList(); c.add(23); c.add("ABCD"); System.out.println(c); c.remove(23); System.out.println(c); //输出结果 [23, ABCD] [ABCD]
整体来说集合的remove()的方法,就像数组删掉一个元素一样,很好理解。
2、在迭代过程中使用集合的remove()的方法。
Collection c2=new ArrayList(); c2.add(10); c2.add("ABC"); c2.add("DEF"); c2.add("H"); Iterator i=c2.iterator(); while (i.hasNext()){ Object o=i.next(); c2.remove(o); System.out.println(o); }
此时,就会报我们遇到的异常.这是为什么呢?
原因:
当删除元素10后,集合发生了结构变化时,迭代器必须要重新获取。而在下一次循环,却没有获取新的迭代器,所以发生了异常。
所以在迭代集合的元素时,不能使用集合对象的remove()方法。
解决办法:使用迭代器中的remove()方法。
3、使用迭代器的remove()方法删除集合元素。
Collection c2=new ArrayList(); c2.add(10); c2.add("ABC"); c2.add("DEF"); c2.add("H"); //获取c的迭代器 Iterator i=c2.iterator(); while (i.hasNext()){//判断集合内是否还有元素 Object o=i.next();//获取该元素 i.remove();//【使用迭代器】删除当前指向的元素 } System.out.println(c2);//查看集合的元素 System.out.println(c2.size());//查看集合的个数 //输出结果 [] 0
在获取迭代器时候,相当于对此时的集合获取了一个当前的状态。而迭代器迭代时,参考该状态进行迭代。如果在迭代时候,集合发生了改变,那么得重新获取集合此时的状态,作为新参考,方便迭代。
使用【迭代器remove】时候,会将删除的元素从状态当中一并删除,那么就相当于更新了迭代器,更新了状态。
而使用【集合remove】时,直接删除元素,没有更新迭代器,没有更新状态,导致目前的状态和原状态不一样。
此外:使用集合的remove()方法,只要romove的时候顺带着写个return。保证不继续循环就不会报错了。