如何在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
相关产品推荐
相关产品推荐

