迭代列表时如何避免ConcurrentModificationException

时间:2017-01-14 21:27:10

标签: arraylist iterator concurrentmodification

我有一个Country类,它保存一个由Human对象组成的列表。在Country类中,我有以下功能;

public void processOneDay(int day, List<Country> countryList, int numberOfCountries ){
        ListIterator<Human> iter = people.listIterator();
        while(iter.hasNext()){
            Human h = iter.next();
            h.move(day, countryList, numberOfCountries);
        }
    }

Human类的move()方法负责将一个人从一个国家移动到另一个国家,但这种方法是从源国的人员名单中删除该人并将其添加到目的地国家的人员名单。因此,在迭代时执行此操作会导致我出现ConcurrentModificationException。我试图使用迭代器本身的删除功能,但我搞砸了更多东西。那么,我该如何处理这种情况呢?

2 个答案:

答案 0 :(得分:1)

只需复制一份清单,即可使用此清单进行迭代。

List<Human> copy = new ArrayList<Human>(people);

答案 1 :(得分:0)

正如您所发现的那样,您无法修改正在迭代的列表,因此有两种选择,您需要迭代列表的副本,或者需要使用for循环遍历列表那并直接索引列表中的项目。

复制列表更容易编写,但如果列表非常大,则会浪费大量CPU周期和内存。使用for (var i = 0; i < list.Count; i++) list[i]有点复杂但效率更高。请注意,如果您从列表中删除项目,则无需增加i