关于ConcurrentModificationException异常

在使用增强 for 循环遍历ArrayList,同时删除某元素时,遇到ConcurrentModificationException异常

for(Person p : personList)
{
  if(id.equals(p.getId))
  {
    personList.remove(p);
    }    
}

因为使用增强for循环的时候,内部原理是调用了iterator 实现。所以比较简单的解释是:

Iterator被创建的时候,建立了一个内存索引表(单链表),这 个索引表指向原来的对象,当原来的对象数量改变的时候,这个索引表的内容没有同步改变,所以当索引指针往下移动的时候,便找不到要迭代的对象,于是产生错 误。List、Set等是动态的,可变对象数量的数据结构,但是Iterator则是单向不可变,只能顺序读取,不能逆序操作的数据结构,当 Iterator指向的原始数据发生变化时,Iterator自己就迷失了方向。
如何才能满足需求呢,需要再定义一个List,用来保存需要删除的对象:
List delList = new ArrayList();
最后只需要调用集合的personList.removeAll(Collection con)方法就可以了。

(来自:http://www.cnblogs.com/frankliiu-java/articles/1759460.html

也通过用指定下标的方式来移除元素,此时不会抛出异常。

因此,使用增强for循环遍历 list 的时候,和使用迭代器遍历的时候一样,不能删除元素,同时不能获取下标。但可以手动添加游标,然后调用personList.remove(index)方法解决。

    int index = 0;
    for (Person p : personList)
    {
	if (p.getId().equals(targetId))
	{
		personList.remove(index);
	}

	index ++;
    }

  

 

 

 

 

posted on 2013-08-29 22:36  JLeight  阅读(168)  评论(0编辑  收藏  举报

导航