在 Java 中,for 循环删除元素的方式有几种。需要特别注意,在使用 for 循环删除元素时,如果不小心可能会导致
ConcurrentModificationException 异常,尤其是当你在遍历集合的同时修改集合的内容时。
下面是几种常见的通过 for 循环删除元素的方式:
1. 使用Iterator的remove方法
2. 使用for循环与倒序遍历(适用于List类型)
3. 使用for-each循环与Iterator(避免直接删除)
4. 使用removeIf方法(Java 8及以上)
5. 使用ListIterator(对于List)
千万不要在常规的 for 循环中直接使用 remove 删除元素。
总结:
1、使用 Iterator 的 remove 方法 是最安全的方式。
2、从后向前遍历 可以避免删除元素时修改集合结构导致的问题。
3、removeIf 方法是 Java 8 之后提供的简洁方法。
4、ListIterator 提供了更灵活的双向遍历,可以用来删除元素。
1. 使用Iterator的remove方法
在遍历集合时,最安全的方法是使用 Iterator 进行删除。Iterator 提供了 remove() 方法,可以在迭代过程中安全地删除元素。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ForLoopRemoveWithIterator {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Integer value = iterator.next();
if (value == 3) {
iterator.remove(); // 删除值为 3 的元素
}
}
System.out.println("删除后的列表: " + list);
}
}
输出:
删除后的列表: [1, 2, 4]
2. 使用for循环与倒序遍历(适用于List类型)
如果你使用的是 List,另一种常见的方法是从后往前遍历,这样可以避免在删除元素时破坏当前的索引。
import java.util.ArrayList;
import java.util.List;
public class ForLoopRemoveReverse {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
// 从后向前遍历
for (int i = list.size() - 1; i >= 0; i--) {
if (list.get(i) == 3) {
list.remove(i); // 删除值为 3 的元素
}
}
System.out.println("删除后的列表: " + list);
}
}
输出:
删除后的列表: [1, 2, 4]
3. 使用for-each循环与Iterator(避免直接删除)
for-each 循环(增强的 for 循环)不能直接删除元素,因为它不能使用 Iterator 的 remove 方法。如果你想在 for-each 中删除元素,推荐使用 Iterator:
import java.util.ArrayList;
import java.util.List;
public class ForEachWithIterator {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
// 使用 Iterator 进行安全删除
for (Iterator it = list.iterator(); it.hasNext(); ) {
Integer value = it.next();
if (value == 3) {
it.remove(); // 使用 Iterator 的 remove 方法删除元素
}
}
System.out.println("删除后的列表: " + list);
}
}
输出:
删除后的列表: [1, 2, 4]
4. 使用removeIf方法(Java 8及以上)
如果你使用的是 Java 8 或更高版本,可以使用 Collection 接口提供的 removeIf 方法。这个方法通过一个谓词(Predicate)来判断是否删除元素,简化了删除操作。
import java.util.ArrayList;
import java.util.List;
public class RemoveIfExample {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
// 使用 removeIf 删除元素
list.removeIf(value -> value == 3); // 删除值为 3 的元素
System.out.println("删除后的列表: " + list);
}
}
输出:
删除后的列表: [1, 2, 4]
5. 使用ListIterator(对于List)
ListIterator 提供了对列表的双向迭代,可以在遍历时进行修改。你可以使用 ListIterator 来遍历并删除符合条件的元素。
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListIteratorRemove {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
ListIterator iterator = list.listIterator();
while (iterator.hasNext()) {
Integer value = iterator.next();
if (value == 3) {
iterator.remove(); // 删除值为 3 的元素
}
}
System.out.println("删除后的列表: " + list);
}
}
输出:
删除后的列表: [1, 2, 4]