先看段代码
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();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.使用迭代器删除元素时,会自动更新迭代器,同时更新集合(同时删除集合中的元素)
删除元素时,建议使用迭代器删除。