使用ArrayList时如何避免ConcurrentModificationException?

时间:2012-12-06 13:46:27

标签: java android

在Android上使用ConcurrentModificationException时如何避免ArrayList

有人可以给出基本的经验法则来避免吗?

3 个答案:

答案 0 :(得分:7)

在迭代你的arraylist时不添加/删除元素。

当您在迭代时修改列表时,此代码将抛出ConcurrentModificationException。

List<String> al = new ArrayList<String>();
al.add("2");
for(String s: al) {
al.remove("2");
}

此代码不会抛出ConcurrentModificationException。

 List<String> al = new Arraylist<String>();
 Iterator<String> itr = al.iterator();
 while(itr.hasNext()){
   itr.next();
   itr.remove();
 }    

您还可以使用java.util.Concurrent包中的某些类,例如java.util.concurrent.CopyOnWriteArrayList,在迭代时修改列表时不会抛出ConcurrentModificationException

  CopyOnWriteArrayList<String> al = new CopyOnWriteArrayList<String>();
  al.add("2");
  Iterator<String> itr = al.iterator();
  while(itr.hasNext()){
  itr.next();
  al.add("3");
 }

答案 1 :(得分:1)

如果要删除ArrayList中的元素,请使用Iterator。例如:

ArrayList<String> someStrings;
// fill someStrings
Iterator<String> it = someStrings.iterator();
while(it.hasNext()){
   String buf = it.next();
   // do sth here
}

答案 2 :(得分:0)

当您在迭代它时在ArrayList中添加/删除/插入元素时会发生这种情况。

错误代码示例:

Iterator it = list.iterator()
while (it.hasNext())
{
    Object o = it.next();
    list.remove(o);
}