在Java中,直接在迭代集合的同时修改集合(例如添加或删除元素)通常会导致ConcurrentModificationException
。为了安全地在迭代时修改集合,你可以使用以下几种方法:
Iterator
的remove
方法如果你只需要在迭代时删除元素,可以使用Iterator
的remove
方法。这是最直接和安全的方法。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
if (element.equals("two")) {
iterator.remove(); // 安全地删除元素
}
}
System.out.println(list); // 输出: [one, three]
}
}
ListIterator
进行添加和删除ListIterator
不仅支持删除,还支持在迭代时添加元素。
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
ListIterator<String> listIterator = list.listIterator();
while (listIterator.hasNext()) {
String element = listIterator.next();
if (element.equals("two")) {
listIterator.remove(); // 删除元素
}
if (element.equals("three")) {
listIterator.add("four"); // 添加元素
}
}
System.out.println(list); // 输出: [one, three, four]
}
}
CopyOnWriteArrayList
如果你需要在多线程环境中安全地修改集合,可以使用CopyOnWriteArrayList
。这种集合在每次修改时都会创建一个新的副本,因此迭代时不会抛出ConcurrentModificationException
。
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class Main {
public static void main(String[] args) {
List<String> list = new CopyOnWriteArrayList<>();
list.add("one");
list.add("two");
list.add("three");
for (String element : list) {
if (element.equals("two")) {
list.remove(element); // 安全地删除元素
}
if (element.equals("three")) {
list.add("four"); // 安全地添加元素
}
}
System.out.println(list); // 输出: [one, three, four]
}
}
for
循环如果你不介意使用索引,可以使用传统的for
循环来迭代和修改集合。
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
for (int i = 0; i < list.size(); i++) {
String element = list.get(i);
if (element.equals("two")) {
list.remove(i); // 删除元素
i--; // 调整索引以避免跳过下一个元素
}
if (element.equals("three")) {
list.add(i + 1, "four"); // 添加元素
i++; // 调整索引以避免重复处理新添加的元素
}
}
System.out.println(list); // 输出: [one, three, four]
}
}
领取专属 10元无门槛券
手把手带您无忧上云