以下代码在JVM中崩溃(并发修改异常)但在DVM中没有崩溃,我无法理解为什么它没有在ororid中崩溃。我正在使用JB
List<String> list = new ArrayList<String>();
list.add("Something");//add only 1 object
for(String a:list){
list.remove(a);
}
答案 0 :(得分:1)
您正在迭代列表以及尝试从同一列表中删除值。这会导致异常。尝试在单独的列表中添加要删除的项目,并在迭代后使用List.removeall()函数删除所有不需要的值。
样品:
List<String> removeList = new ArrayList<String>();
for(String a:list) {
removeList.add(a);
}
list.removeAll(removeList);
答案 1 :(得分:1)
嗨是的,它会给出一个例外
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at coffee.CoffeeApp.main(CoffeeApp.java:20)
Java Result: 1
因为
通过保持修改计数来实现快速失败行为,如果迭代线程实现修改计数的更改,则会抛出ConcurrentModificationException。
所以做这样的事情并在Iterator
的帮助下迭代列表List<String> list = new ArrayList<String>();
list.add("Something");//add only 1 object
Iterator<String> it = list.iterator();
while(it.hasNext()) {
it.next();
it.remove();
//Do something with obj
}
我们可以说迭代器的失败快速行为不能保证,因为这里存在不同步的并发修改。失败快速迭代器会尽最大努力抛出ConcurrentModificationException。因此,失败快速迭代器一旦意识到自迭代开始后修改了Collection的结构,并且迭代器线程实现了修改,就会失败,然后抛出ConcurrentModificationException。更改可以是添加,更新或删除。
在android中可能会有不同的实现,所以没有问题。
对于比较研究,请访问,但我没有一个伟大的R&amp; D这里
http://www.docjar.com/html/api/java/util/ArrayList.java.html
V / S
答案 2 :(得分:0)
当您迭代List(或任何Collection,就此而言)时,您只能通过完全相同的Iterator修改List。所以这将有效:
for(Iterator<String> listIter = list.iterator(); listIter.hasNext();) {
listIter.next().remove();
}