使用临时列表时出现ConcurrentModificationException

时间:2016-12-06 20:08:05

标签: java arraylist collections concurrentmodification

public static ArrayList<Job> ready = new ArrayList<Job>();
...later on....
ArrayList<Job> temp = ready;
for (Iterator<Job> iterator = temp.iterator(); iterator.hasNext(); ) {
    Job j = (Job) iterator.next();
    if (j.number == number) {
        ready.remove(j);
        ready.add(j);
        system.devices-=devices;
        j.devices+=devices;
        iterator.remove();
    }
}

为什么会抛出错误?当然,ready = temp,但我正在迭代temp,我不会改变temp。我怎样才能解决这个问题呢?

4 个答案:

答案 0 :(得分:1)

temp是对ready的引用,ready的迭代器会看到temp的所有更改。您实际上可以使用Collections.copy

ArrayList<Job> temp = new ArrayList<Job>();
Collections.copy( temp, ready );

答案 1 :(得分:1)

您正在尝试在迭代时更改列表。 tempready是相同的列表 - 更改一个更改另一个列表。如果您想复制列表,可以使用temp = new ArrayList<Job>(ready)

答案 2 :(得分:0)

您正在尝试在循环时修改集合,并且此节点无法支持此类操作。 您有两种不同的解决方案: 1-将集合复制到另一个集合,并基于一个循环并修改另一个集合。 2-最佳实践是使用并发集合,例如: CopOnWriteArrayList,ConcurrentSkipListMap

答案 3 :(得分:-2)

您在迭代时通过添加和删除元素来改变列表,这不是一个好主意......

改为放置符合条件的元素

if (j.number == number) {

在另一个列表中,并执行了temp.removeAll(c);