在Android上使用ConcurrentModificationException
时如何避免ArrayList
?
有人可以给出基本的经验法则来避免吗?
答案 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);
}