并发列表修改

时间:2016-06-27 14:36:40

标签: java

下面是一些代码(为了清楚起见删除了很多代码),它显示了我的并发列表修改问题:

for (final Week week : this.demand.getWeeks().getAllWeeks()) {
    final List<Week> weeksExcludingThisWeek = this.demand.getWeeks().getAllWeeks();
    weeksExcludingThisWeek.remove(week);
}

据我所知,我删除了对同一周对象的引用,但是在for循环中使用的列表不同。

如何防止这种情况发生?

3 个答案:

答案 0 :(得分:2)

在删除元素之前,实际上将其复制到新列表中:

List<Week> weeksExcludingThisWeek = new ArrayList<>(this.demand.getWeeks().getAllWeeks());

您目前正在从正在迭代的同一列表中删除该周。

答案 1 :(得分:2)

使用迭代器来避免ConcurrentModificationException s

查看文档:{​​{3}}

你会发现:

  

迭代器允许调用者在迭代期间使用明确定义的语义从底层集合中删除元素

答案 2 :(得分:1)

您正在使用this.demand.getWeeks().getAllWeeks() 对于迭代变量week和for循环变量weeksExcludingThisWeek

两个对象中的相同引用是问题。你无法修改循环中的当前迭代对象。

在循环内创建新对象new ArrayList(this.demand.getWeeks().getAllWeeks())