问题: 删除列表 ['111', '111', '222', '333'] 中的 '111'?

1
2
3
4
5
6
7
List<String> list = new ArrayList<>();
list.add("111");
list.add("111");
list.add("222");
list.add("333");
String target = "111";
// 如何从 list 中删除 target?

错误解法 1:

1
2
3
4
5
6
7
8
9
10
for (String s : list) {
if (s.equals(target)) {
list.remove(s);
}
}
// 输出:
// Exception in thread "main" java.util.ConcurrentModificationException
// at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
// at java.util.ArrayList$Itr.next(ArrayList.java:851)
// at com.xdbin.service.Main.main(Main.java:43)

错误解法 2:

1
2
3
4
5
6
7
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals(target)) {
list.remove(i);
}
}
// 删除后:111, 222, 333, 只会删除一个元素。
// 原因是删除的过程中改变了 list 的下标,第一个 "111" 删除之后,第二个 "111" 的下标变为0,而 i = 1

正确解法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String v = it.next();
if (v.equals("111")) {
it.remove();
}
}
// 或
for (Iterator<String> it = list.iterator(); it.hasNext();) {
String v = it.next();
if (v.equals("111")) {
it.remove();
}
}
// 或
list.removeIf(v -> v.equals(target));