-3

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

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

4

3 回答 3

7

通过在遍历您的数组列表时不添加/删除元素。

当您在迭代时修改列表时,此代码将引发 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.CopyOnWriteArrayListConcurrentModificationException在迭代时修改列表时不会抛出:

  CopyOnWriteArrayList<String> al = new CopyOnWriteArrayList<String>();
  al.add("2");
  Iterator<String> itr = al.iterator();
  while(itr.hasNext()){
  itr.next();
  al.add("3");
 }
于 2012-12-06T13:47:38.733 回答
1

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

ArrayList<String> someStrings;
// fill someStrings
Iterator<String> it = someStrings.iterator();
while(it.hasNext()){
   String buf = it.next();
   // do sth here
}
于 2012-12-06T13:55:58.793 回答
0

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

错误代码示例:

Iterator it = list.iterator()
while (it.hasNext())
{
    Object o = it.next();
    list.remove(o);
}
于 2012-12-06T13:47:53.267 回答