引用数组的arraylist时出现java.util.ConcurrentModificationException错误

时间:2015-05-21 16:55:04

标签: java arrays arraylist

我用过

>>> list(izip_longest(*([iter(li)] * n)))
[(0, 1, 2, 3), (4, 5, 6, 7), (8, 9, 10, 11), (12, 13, 14, 15), (16, 17, 18, 19), (20, None, None, None)]

定义数组的arrayList 但是当我想要引用这个arrayList中的元素时,我写道:

ArrayList<char[]> record = new ArrayList<char[]>();

它不起作用,并且有如下错误消息:

java.util.ConcurrentModificationException

在行

for(char[] char1 : record){
    if(Arrays.equals(char1, char2)){
        return false;
    }
    record.add(char2);
}

我的代码出了什么问题? 谢谢!

2 个答案:

答案 0 :(得分:0)

看一下ArrayList的javadoc:

  

此类的迭代器和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的remove或add方法之外,迭代器将抛出一个ConcurrentModificationException。

你在这一行上使用的增强的for循环:

for(char[] char1 : record){

隐式创建一个列表迭代器并迭代它。

问题就出现了:

record.add(char2);

当您在迭代时修改列表时,您需要使用列表的迭代器来迭代并适当添加。

一种可能的解决方案是手动检索列表迭代器并进行迭代,这将公开对add()方法的访问,该方法可用于在迭代时安全地将项添加到列表中。例如:

// Here we manually retrieve the list iterator to work with
ListIterator<char[]> iter = record.listIterator();

// Iterating through the entire list is done via the `hasNext()` method
while(iter.hasNext()){
    char[] char1 = iter.next();

    if(Arrays.equals(char1, char2)){
        return false;
    }

    // Note: the add() method can only be called once per next() method call
    iter.add(char2);
}

注意,一旦添加,列表迭代器最终将迭代到新添加的元素中。为了防止这种情况,您可以将新元素添加到临时保留列表中,然后根据需要进行传输(例如迭代完成时)。

答案 1 :(得分:-1)

迭代时不能修改列表,因为这可能会创建一个无限循环的无限循环。

如果您要完成的工作是将nchar2副本添加到record的末尾,其中n是数组的数量char1char2中第一次出现char2之前不等于record,那么您应该只计算有多少,然后在事实之后添加许多副本或类似的东西。

ArrayList<char[]> record2 = new ArrayList<char[]>();
for(char[] char1 : record){
    if(Arrays.equals(char1, char2)){
        break;
    }
    record2.add(char2);
}
record.addAll(record2);

以上就是我要做的。我改为添加一个不同的列表,然后在它退出之后,将它们全部添加到record的末尾。