在Java中,使用foreach循环遍历集合时在集合上调用Remove是否合法?例如:

List<String> names = ....
for (String name : names) {
   // Do something
   names.remove(name).
}

作为补充,删除尚未迭代的项合法吗?例如,

//Assume that the names list as duplicate entries
List<String> names = ....
for (String name : names) {
    // Do something
    while (names.remove(name));
}

推荐答案

要在迭代集合时安全地从集合中删除,应该使用迭代器.

例如:

List<String> names = ....
Iterator<String> i = names.iterator();
while (i.hasNext()) {
   String s = i.next(); // must be called before you can call i.remove()
   // Do something
   i.remove();
}

Java Documentation:

这个类的迭代器和listIterator返回的迭代器

对于许多新手来说,可能不清楚的是,使用for/foreach构造对列表进行迭代会隐式创建一个必然无法访问的迭代器.这个信息可以在here页找到

Java相关问答推荐

Spring Boot找不到Mapper bean

CriteriaQuery with max

如何转换Tue Feb 27 2024 16:35:30 GMT +0800 String至ZonedDateTime类型""

Javascript在边界中心调整ImageView大小

在for—each循环中的AnimationTimer中的if语句'

无法处理批处理侦听器中的反序列化异常

在模拟超类中设置非setter属性的值

Exe4j创建的应用程序无法再固定在任务栏Windows 11上

将带有js文件的 bootstrap 程序导入maven项目时出错

为什么使用JDK21获取锁定锁比使用JDK11慢

声明MessageChannel Bean的首选方式

如何在代码中将行呈现在矩形前面?

有效的公式或值列表必须少于或等于255个字符

没有使用Lombok生成的参数

如何调整JButton的大小以适应图标?

为什么使用lo索引来解决二进制搜索问题不同于使用hi索引?

将基于实例编号的对象列表拆分为新的对象列表

如何使用Rascal Evaluator从编译的JAR访问Rascal函数?

Java中的一个错误';s stdlib SocksSocketImpl?

";home/runner/work/中没有文件...匹配到[**/pom.xml];Maven项目的构建过程中出现错误