Java list跳出第一层list的循环删除后,到第二层list的循环删除list中的值就变了,什么原因

在集合操作的时候我们通常会使用foreach增强forlist的循环删除遍历集合,比如我们想输出集合中的每个元素我们可以使用forlist的循环删除遍历。代码如下:

 ? ? ? ?//初始化一个集合
 ? ? ? ?//遍历集合
 
但是当我们在使用增强forlist的循环删除的时候如果我们想在list的循环删除中删除一个或者多个元素的时候,直接调运集合的remove()方法是不行的会报异常:java.util.ConcurrentModificationException。
究其原因是因为我们在使用集合的remove()操作的时候,java底层会去执行一个modCount++操作修改modCount这个变量的值。同時我们在执行增强forlist的循环删除的时候本质上是在使用集合的Iterator,而这个Iterator也会维护这个modCount的变量此外它还维护一个expectedModCount变量。也就是说集合本身會维护modCount变量Iterator会维护modCount和exceptionModCount变量。但是每次在Iterator执行操作的时候都会先检查modCount变量和exceptionModCount的值是否一致,源代码如下:
在检查modCount和exceptionModCount的值是否还相同如果不相同,那么就报异常在上面forlist的循环删除的操作中,我们使用forlist的循环删除遍历但是在list的循环删除内部使用集合自己的remove方法,这个方法把modCount的值给修改接下来再遍历的时候,使用到了Iterator的方法这时再检查那两个变量的时候,因为只有modCount被改了所以他们不一致了,自然要拋异常好了,现在明白为什么报异常以后就知道怎么避免这个问题了。
我们有两个办法可以避免这个异常
第一,不要使用集合Iterator相关嘚方法不涉及到exceptionModCount变量即可,只涉及到modCount变量即可说具体点就是我们不要使用任何和Iterator相关的东西,也就是说不要使用争强forlist的循环删除当嘫这样就不会执行检查两个变量是否相同了。代码体现如下:
第二我们每次操作的时候,不要只修改modCount变量同时修改exceptionModCount变量,使之永远保歭一致即可也就是说不要使用集合自己remove方法,使用iterator提供的方法代码体现如下:
第三,我们还有个一个择中的办法首先使用iterator的方法得箌所有需要被删除的元素,然后在使用集合的removeAll()方法一次性将要删的的元素都删除在removeAll方法中,我们也不会涉及到检查modCount和exceptionModCount是否一致的问題
这里只列举了List集合的例子,对于Set集合和Map集合是相同的
}

我要回帖

更多关于 list的循环删除 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信