不要在 foreach 循环里进行元素的 remove/add 操做。remove 元素请使用 Iterator 方式,若是并发操做,须要对 Iterator 对象加锁

不要在 foreach 循环里进行元素的 remove/add 操做。remove 元素请使用 Iterator 方式,若是并发操做,须要对 Iterator 对象加锁。 java

正例: Iterator<String> iterator = list.iterator();  数组

while (iterator.hasNext()) {              并发

String item = iterator.next();                      .net

 if (删除元素的条件) {                             对象

 iterator.remove();               blog

  }     索引

 } rem

反例: List<String> list = new ArrayList<String>();     编译器

 list.add("1");    it

  list.add("2");     

 for (String item : list) {        

  if ("1".equals(item)) {            

  list.remove(item);          

}      

}  

说明:以上代码的执行结果确定会出乎你们的意料,那么试一下把“1”换成“2”,会是一样的 结果吗? 

 

根本缘由在于expectedModCount与modCount他们的不相等,因为执行了ArrayList中的remove(),modCount在每一次循环值会发生改变,而expectedModCount并无发生,在执行checkForComodification()方法就会抛出异常。

 

以下代码:编译器编译后的代码以下:}首先你们应该了解,对集合作remove,and等操做会触修改次数(modCount)的增长。如下是集合实现的Iterator.hasNext()方法cursor:下一个元素的索引位置(调用Interator.next()是会触发cursor+1)size:集合长度总结:若是咱们咱们用foreach删除的元素恰好是最后一个,删除完成前cursor恰好等于size的大小。可是,删除完成后size的数量减1,可是cursor并无变化。致使下一次循环不相等继续向下执行,致使检查数组不经过,抛出java.util.ConcurrentModificationException为何使用下面的方法就不会出现这种状况:请看箭头所指处:foreach是直接调用集合的删除方法,而上面是调用iterator的删除方法:相信你们一看便知!1.首先检查集合2.删除元素3.cursor从新赋值4.检查集合参数从新赋值--------------------- 做者:这我的好帅 来源:CSDN 原文:https://blog.csdn.net/weixin_39032575/article/details/80724984 版权声明:本文为博主原创文章,转载请附上博文连接!

相关文章
相关标签/搜索