先看段代码
public static void main(String[] args) {
Collection collection = new ArrayList();
collection.add(1);
collection.add(2);
collection.add(3);
Iterator iterator = collection.iterator();
while(iterator.hasNext()){
Object next = iterator.next();
System.out.println(next);
}
}
这样遍历集合是没有问题的。
但是如果像这样
public static void main(String[] args) {
Collection collection = new ArrayList();
//没添加元素之前就获取迭代器 或者说获取迭代器之后集合又发生了改变
Iterator iterator = collection.iterator();
collection.add(1);
collection.add(2);
collection.add(3);
while(iterator.hasNext()){
Object next = iterator.next();
System.out.println(next);
}
}
会报ConcurrentModification异常。
通俗点:迭代器就类似于一个快照,获取之后就不能改变了。如果改变,在通过迭代器获取元素的时候,就会报ConcurrentModificationException.
所以,在迭代集合元素的过程中,不能调用remove方法,删除元素。
public static void main(String[] args) {
Collection collection = new ArrayList();
Iterator iterator = collection.iterator();
collection.add(1);
collection.add(2);
collection.add(3);
while(iterator.hasNext()){
Object next = iterator.next();
//集合发生改变了 在调用迭代器的next方法 会报异常
collection.remove(next);
System.out.println(next);
}
}
所以报
那么我们应该如何删除集合中的元素呢?
我们可以应迭代器删除。
public static void main(String[] args) {
Collection collection = new ArrayList();
Iterator iterator = collection.iterator();
collection.add(1);
collection.add(2);
collection.add(3);
while(iterator.hasNext()){
Object next = iterator.next();
//使用迭代器删除 把快照中的元素删除后,迭代器对应的集合中的元素也就删除
//这样就保持了快照和集合中元素一致
iterator.remove();
System.out.println(next);
}
}
成功删除,不会报错。
结论:
两种删除集合中的元素的方式:
1.Collection.remove(Object o) 集合中的remove方法
2.Iterrator.remove()迭代器中的remove方法.
结论:
a.使用集合删除元素时,迭代器获取的快照,发现原集合状态发生改变,快照还是原集合的快照。导致了状态不一致,会报ConcurrentModificationException。
如果坚持使用集合删除元素,需要更新迭代器。也就是要重新获取迭代器。
b.使用迭代器删除元素时,会自动更新迭代器,同时更新集合(同时删除集合中的元素)
删除元素时,建议使用迭代器删除。