不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterator 对象加锁

不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterator 对象加锁。 

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

while (iterator.hasNext()) {              

String item = iterator.next();                      

 if (删除元素的条件) {                             

 iterator.remove();               

  }     

 } 

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

 list.add("1");    

  list.add("2");     

 for (String item : list) {        

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

  list.remove(item);          

}      

}  

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


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

猜你喜欢

转载自blog.csdn.net/suyujiezhang/article/details/78814715