访问List时如何处理并发修改异常

时间:2015-06-17 09:47:35

标签: java

在运行以下代码的每个循环时,我收到了并发修改异常:

if (entityList.isEmpty()) {
    entityList.add(entity);
}
else {
    for (Entity e: entityList) {
        if (e.getName().equals(p.toString())) {
            e.setOccurrence(e.getOccurrence() + 1);
        }
        else {
            entityList.add(entity);
        }
    }
}

这是因为我尝试从entityList读取并在同一个线程中写入它,对吧? 我不确定如何解决使用Iterator对象的问题似乎只有在删除列表项时发生异常才有意义。

3 个答案:

答案 0 :(得分:2)

你得到了那个例外,因为你正在修改循环中的列表(你在循环内的列表上调用add)。

将要添加的实体放入临时列表中,并在循环后将它们添加到原始列表中:

if (entityList.isEmpty()) {
    entityList.add(entity);
}
else {
    List<Entity> tempList = new ArrayList<>();

    for (Entity e: entityList) {
        if (e.getName().equals(p.toString())) {
            e.setOccurrence(e.getOccurrence() + 1);
        }
        else {
            tempList.add(entity);
        }
    }

    entityList.addAll(tempList);
}

答案 1 :(得分:0)

对于每个不匹配的条目,您真的是要将entity添加到列表中吗?如果您的列表包含10个元素且只有其中一个匹配,则您将向列表中添加9个新元素。这可能不是你想要的。

考虑使用Map<String,Entity>代替List

Map<String,Entity> entityMap;

......

String name = p.toString();
Entity match = entityMap.get(name);
if (match == null) {
    entityMap.put(name, entity);
} else {
    match.setOccurence(match.getOccurence() + 1);
}

答案 2 :(得分:0)

而不是每个样式循环或迭代器使用旧的for循环。像...

for(int index=0; index < entityList.size(); index++){
 Entity e = entityList.get(index);
 if (e.getName().equals(p.toString())) {
        e.setOccurrence(e.getOccurrence() + 1);
    }

}