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