并发列表修改



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

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

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

如何防止这种情况发生?

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

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

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

使用迭代器避免ConcurrentModificationException S

请查看文档:https://docs.oracle.com/javase/8/docs/api/java/java/util/itilator.html

您会发现:

迭代器允许呼叫者使用定义明确的语义

在迭代期间从基础集合中删除元素

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

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

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

相关内容

  • 没有找到相关文章