有的小伙伴在进行遍历List集合时可能会遇到java.util.ConcurrentModificationException,之前我没有遇见过,在学习阿里巴巴出的java开发手册时看到了这一条,便自己进行了一番测试,结果发现果然如此。感谢前人跳坑,才有我等小辈的滋润编码生活。
话不多说,上代码:
package a;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListForeach {
/**
*
* @Title: main
* @Description: 当需要便利List等集合时,需要变更集合内容时注意事项
* @param args 设定文件
* @author wangkai
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
List<String> a = new ArrayList<String>();
System.out.println(a.toString());
a.add("1");
a.add("2");
System.out.println(a.toString());
/**
*
方法1. 采用foreach循环遍历。
for (String temp : a) {
if("1".equals(temp)){
a.remove(temp);
System.out.println(a.toString());
}
}
*/
/**
* 方法2. 采用Iterator迭代。
*/
for(Iterator it = a.iterator();it.hasNext();) {
String o = (String) it.next();
if("1".equals(o)){
//a.remove(o);
it.remove();
System.out.println(a.toString());
}
}
System.out.println(a.toString());
}
}
在这里面我们提供了两个方法来进行遍历并删除其中的一条元素。
方法1,采用foreach循环,当然删除元素「1」时是没有问题的,当你删除元素「2」时,就该抛出此异常。
方法2,网上建议采用Iterator来进行迭代集合,但我也发现他会出现此异常。
最后总结出:
1。问题的根源在于删除了元素后,foreach遍历的数组进行了实时更新(或者是引用的地址内的数据已经被更改)导致的下一个值找不到。
2。网上建议采用的Iterator迭代的方法,由于其迭代在初始化的时候就已经固定了原来的数据,删除并不会更改迭代的数据(应该是类似于拷贝了一份出来)。