之前在公司实习的时候,在使用 list.remve(obj) 方法的时候报错:ConcurrentModificationException,最近又遇到了,始终没弄明白,记录一下。
- 错误产生
- 如何解决
public class Test {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
// 错误产生!
for (String str : list) list.remove(str);
for (String str : list) System.out.println(str);
}
}
可以看出,当使用 for-each() 循环的时候删除元素,会报错。
使用下面 2 种方法能有效避免这种错误:
1.使用 list.size() 遍历下标
public class Test {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
for (int i = 0; i < list.size(); i++) {
list.remove(list.get(i));
}
for (String str : list) System.out.println(str);
}
}
每次删除元素以后,list 结构就会马上发生改变,所以当一次删除元素之后,list 仅剩下 3个元素,此时遍历下标 i++,由 0 -> 1,下一个删除的元素即为 b, c, d 中的下标为1的 c。
2.使用 iterator 迭代器
public class Test {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
String str = iterator.next();
if (str == "a" || str == "b") iterator.remove();
}
for (String str : list) System.out.println(str);
}
}
当 iterator 调用 remove 方法的时候,即删除此时 iterator 指向的元素。



