【洞库】迭代集合的同时修改它报错ConcurrentModificationException
错误java.util.ConcurrentModificationException通常发生当我们试图在迭代一个集合(如列表)的同时修改它。
下面代码,在外层循环中迭代list,在内层循环中迭代yearData,并在某些条件下向yearData添加新的元素,这就引起了ConcurrentModificationException错误。
for (MonthHumidity data : list) {
for (MonthTemHum th : yearData) {
if (th.getMonth().equals(data.getMonth())) {
th.setAvgHumidity(data.getAvgHumidity());
th.setWetDays(data.getWetDays());
th.setDryDays(data.getDryDays());
} else {
MonthTemHum monthData = new MonthTemHum();
monthData.setAvgHumidity(data.getAvgHumidity());
monthData.setWetDays(data.getWetDays());
monthData.setDryDays(data.getDryDays());
yearData.add(monthData); // 这里修改了列表
}
}
}
解决办法
先收集所有要添加的元素,然后在循环外部将它们添加到集合中。
List<MonthTemHum> toAdd = new ArrayList<>();
for (MonthHumidity data : list) {
boolean matched = false;
for (MonthTemHum th : yearData) {
if (th.getMonth().equals(data.getMonth())) {
th.setAvgHumidity(data.getAvgHumidity());
th.setWetDays(data.getWetDays());
th.setDryDays(data.getDryDays());
matched = true;
break;
}
}
if (!matched) {
MonthTemHum monthData = new MonthTemHum();
monthData.setAvgHumidity(data.getAvgHumidity());
monthData.setWetDays(data.getWetDays());
monthData.setDryDays(data.getDryDays());
toAdd.add(monthData);
}
}
yearData.addAll(toAdd);
上述代码首先为要添加的元素创建一个新的列表toAdd。在双循环中,如果没有匹配项,就将元素添加到toAdd列表中,而不是直接修改yearData。在循环结束后,我们将toAdd中的所有元素一次性添加到yearData中,从而避免了异常。
浙公网安备 33010602011771号