写这篇文章的原因还是老生常谈的Iterator中调用Collection的remove会出现各种各样的bug的问题。但是List和Set中出现的情形不一样,因此深挖一下并进行比较。
首先我们来看现象,此处用最常用的ArrayList和HashSet举例:
List
1.
public static void main(String[] args) {
List<Integer> a = new ArrayList<>();
a.add(1);
a.add(2);
a.add(3);
a.add(4);
for (Integer b : a) {
if (b==4) {
a.remove(b);
}
}
System.out.println(a);
}
返回
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)
2.
public static void main(String[] args) {
List<Integer> a = new ArrayList<>();
a.add(1);
a.add(2);
a.add(3);
a.add(4);
for (Integer b : a) {
if (b==3) {
a.remove(b);
}
}
System.out.println(a);
}
返回
[1, 2, 4]
3.
public static void main(String[] args) {
List<Integer> a = new ArrayList<>();
a.add(1);
a.add(2);
a.add(3);
a.add(4);
for (Integer b : a) {
if (b==2) {
a