ArrayList的ConcurrentModificationException

我有以下一段代码:

private String toString(List<DrugStrength> aDrugStrengthList) { StringBuilder str = new StringBuilder(); for (DrugStrength aDrugStrength : aDrugStrengthList) { if (!aDrugStrength.isValidDrugDescription()) { aDrugStrengthList.remove(aDrugStrength); } } str.append(aDrugStrengthList); if (str.indexOf("]") != -1) { str.insert(str.lastIndexOf("]"), "\n " ); } return str.toString(); } 

当我尝试运行它,我得到ConcurrentModificationException ,任何人都可以解释为什么会发生,即使代码运行在同一个线程? 我怎么能避免它?

如果您使用“for each”循环浏览,则无法从列表中删除。 你可以使用Iterator 。 更换:

 for (DrugStrength aDrugStrength : aDrugStrengthList) { if (!aDrugStrength.isValidDrugDescription()) { aDrugStrengthList.remove(aDrugStrength); } } 

附:

 for (Iterator<DrugStrength> it = aDrugStrengthList.iterator(); it.hasNext(); ) { DrugStrength aDrugStrength = it.next(); if (!aDrugStrength.isValidDrugDescription()) { it.remove(); } } 

像其他答案一样,您不能从正在迭代的集合中删除项目。 你可以通过明确使用Iterator并在那里删除项来解决这个问题。

 Iterator<Item> iter = list.iterator(); while(iter.hasNext()) { Item blah = iter.next(); if(...) { iter.remove(); // Removes the 'current' item } } 

我喜欢一个相反的顺序,例如:

 int size = list.size(); for (int i = size - 1; i >= 0; i--) { if(remove){ list.remove(i); } } 

因为它不需要学习任何新的数据结构或类。

在遍历循环时,您正试图在remove()操作中更改List值。 这将导致ConcurrentModificationException。

按照下面的代码,这将实现你想要的,但不会抛出任何exception

 private String toString(List aDrugStrengthList) { StringBuilder str = new StringBuilder(); List removalList = new ArrayList(); for (DrugStrength aDrugStrength : aDrugStrengthList) { if (!aDrugStrength.isValidDrugDescription()) { removalList.add(aDrugStrength); } } aDrugStrengthList.removeAll(removalList); str.append(aDrugStrengthList); if (str.indexOf("]") != -1) { str.insert(str.lastIndexOf("]"), "\n " ); } return str.toString(); } 

应该有支持这种操作的List接口的并发实现。

尝试java.util.concurrent.CopyOnWriteArrayList.class

我们可以使用并发集合类来避免ConcurrentModificationException迭代集合,例如CopyOnWriteArrayList而不是ArrayList。

检查这个post的ConcurrentHashMap

http://www.journaldev.com/122/hashmap-vs-concurrenthashmap-%E2%80%93-example-and-exploring-iterator