集合ArrayList遍历并添加元素报错
案例:创建一个集合,存入两个元素,“曹操” “貂蝉” ,遍历集合,如果发现遍历的元素是貂蝉,就向集合中添加一个“吕布”
代码实现:
ArrayList<Object> list = new ArrayList<>();
list.add("曹操");
list.add("貂蝉");
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("貂蝉")){
list.add("吕布");
}
System.out.println(list.get(i));
}
//增强for循环遍历
for (Object o:list){
System.out.println(o);
if (o.equals("貂蝉")){
list.add(1,"吕布");
}
}
Iterator it= list.iterator();
while (it.hasNext()){
if (it.equals("貂蝉")){
list.add("吕布");
}
System.out.println(it.next());
}
可是在运行的时候,我们却发现报java.util.ConcurrentModificationException的错误
我们按住crtl点击进入Iteator的内部,选中它后使用菜单中的Navigate中的Type Hierarchy
因为集合变化次数自增了,而迭代器的变化次数并没有跟着变化,才会报错。
而修改元素,并没有使集合的变化次数进行自增,与迭代器的变化次数的一样的,所以不会报错。同理,删除元素时,集合的变化次数也跟着改变了,所以也会报错!