You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在for循环中修改population集合?解决ConcurrentModificationException异常

解决遍历集合时删除元素的ConcurrentModificationException问题

方法1:正确使用Iterator的remove方法

你之前用Iterator没生效,大概率是没用到Iterator自带的remove()方法,而是依然调用了集合的删除方法。正确写法应该是:

Iterator<testpop> iterator = testpops.iterator();
while (iterator.hasNext()) {
    testpop t = iterator.next();
    if (dateToTime(t.arrival) <= time()) {
        System.out.println(t.arrival);
        iterator.remove(); // 必须用Iterator的remove,不能调用集合的remove_testpops
    }
}

这种方式是Java集合框架设计的安全遍历删除方式,不会触发并发修改异常。

方法2:用Stream过滤生成新集合(Java 8+)

如果你的场景不需要在遍历中做太多额外操作,用Stream过滤更简洁:

testpops = testpops.stream()
    .filter(t -> dateToTime(t.arrival) > time()) // 留下不符合删除条件的元素
    .collect(Collectors.toList()); // 根据原集合类型调整,比如Set用Collectors.toSet()

注意如果原集合是线程安全的类型(比如CopyOnWriteArrayList),或者有特殊的修改限制,需要对应调整收集方式。

方法3:先收集要删除的元素,再批量删除

这种方式不用改遍历习惯,先把要删的元素存到临时集合,遍历结束后一次性删除:

List<testpop> toRemove = new ArrayList<>();
for (testpop t : testpops) {
    if (dateToTime(t.arrival) <= time()) {
        System.out.println(t.arrival);
        toRemove.add(t);
    }
}
testpops.removeAll(toRemove);

适合集合元素不多的场景,操作直观。

内容的提问来源于stack exchange,提问作者Steffen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 05:55:29