Java App抛出ConcurrentModificationException

时间:2014-09-15 07:27:46

标签: arraylist collections hashmap concurrentmodification copyonwritearraylist

这是我的代码:

public class Test {
    public static void main(String[] args){
        ArrayList<Integer> list = new ArrayList();
        list.add(1);
        list.add(2);
        list.add(2);
        list.add(2);
        list.add(5);
        int inteval = 0;
        Iterator<Integer> it = list.iterator();
        for(;it.hasNext();){
            Integer n = it.next();
            list.remove(n);
            if (list.contains(n-inteval)){
                list.remove(list.indexOf(n-inteval));
                if (list.contains(n-inteval-inteval)){
                    list.remove(list.indexOf(n-inteval-inteval));
                }else{
                    list.add(n-inteval);
                    list.add(n);
                }
            }
        }
    }
}

此代码将抛出ConcurrentModificationException,我尝试使用CopyOnWriteArrayList,但我发现it.next()返回上次删除的值!我怎么修理它?

2 个答案:

答案 0 :(得分:0)

这是因为您正在执行以下操作:

    Iterator<Integer> it = list.iterator();
    for(;it.hasNext();){
        Integer n = it.next();
        list.remove(n);

使用Iterator时,您无法使用listlist.remove()功能修改list.add()。要使用迭代器删除元素,您需要调用it.remove(),这将删除使用it.next()获得的元素。如果您真的想这样做,那么您应该执行以下操作:

    for(int i = 0; i < list.size(); i++){
        Integer n = list.get(i);
    ...

虽然您还需要确保在修改列表并且元素来回推送时,您只需检查一次元素。您可能更容易使用所需的元素构建不同的列表。

答案 1 :(得分:0)

使用任何list方法获取Iterator后,不应修改列表。

正如已经指出的那样 - 在Iterator实例上调用remove方法。

例如 -

public class Test {
    public static void main (String... at) throws Exception {
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(2);
        list.add(2);
        list.add(5);

        Iterator<Integer> it = list.iterator();
        //below while will remove every element from the list
        while (it.hasNext()) {
            it.next();
            it.remove();
        }
        //this will leave 5 as the only element in list
        /*while (it.hasNext()) {
            if (it.next() != 5) {
                it.remove();
            }
        }*/
        //below loop will remove all the occurences of 1 or 2
        while (it.hasNext()) {
            Integer number = it.next();
            if (number == 1 || number == 2) {
                it.remove();
            }
        }
        System.out.println(list.toString());
    }
}