java-遍历Arraylist时发生ConcurrentModificationException(不删除)

提问

我目前在遍历ArrayList时遇到问题.我在这里阅读了几篇文章,但似乎没有任何事情可以解决我的问题.这是我的代码:

//restaurants contains a list of all restaurants and i want to filter them
List<Restaurant> newList = new ArrayList<Restaurant>();
List<Restaurant> allRestaurants = new ArrayList<Restaurant>(restaurants);
if (query != null && query.length() > 0 && !query.equals("*")) {
            synchronized (allRestaurants) {
                for (Iterator<Restaurant> it = allRestaurants.iterator(); it
                        .hasNext();) {
                    Restaurant restaurant = it.next();
                    if (restaurant.getCity().contains(query)) {
                        synchronized (newList) {
                            newList.add(restaurant);
                        }
                    } else {
                        newList = allRestaurants;
                    }
                }
            }

这是我修改过的代码,具有一些我在这里已读过的想法(同步,使用迭代器代替for-each-loop).我什至已经同步了整个方法,但仍然出现异常.

以下行中发生了异常:

Restaurant restaurant = it.next();

我不明白.我不在此行中处理列表.为什么会发生这种情况,我该如何解决?

最佳答案

else{
    newList = allRestaurants;
}

几乎可以肯定这是您的问题.

将newList分配给allRestaurants,然后添加到newList会导致您的共修改.

也就是说,在newList = allRestaurants之后,任何添加到newList的操作都会更新allRestaurants中的mod计数,从而导致您的错误.