1)迭代器Iterator是一个对象,它的工作是遍历并选择序列中的对象,提供了一种访问一个容器Container对象中的各个元素,而又不必暴露该对象的内部细节的方法。
2)通过迭代器,开发人员不用了解容器底层的结构,就可以实现对容器的遍历。由于创建迭代器的代价小,因此迭代器通常被称为轻量级的容器。
三个方法:
1)iterator():返回一个Iterator,通过next()方法返回第一个元素。
2)hashNext():判断容器中是否还有元素,有的话,使用next()方法可以获取下一个元素。
3)remove():可以删除迭代器返回的元素。
ConcurrentModificationException异常
使用iterator()方法时会碰到这个异常,通常是由于在使用Iterator遍历容器的同时又对容器做增加或删除操作所导致的。或者由于多线程操作导致,当一个线程使用迭代器遍历容器的同时,另外一个线程对这个容器进行添加或删除操作。
当调用容器的iterator()方法返回一个Iterator对象时,把容器中包含的对象的个数赋值给了一个变量modCount,在调用next()方法时会比较变量expectedModCount与容器中市级对象的个数modCount的值是否相等,若不相等,则会抛出ConcurrentModificationException异常。因此在使用Iterator遍历容器的时候,如果对容器进行增加或者删除操作,就会改变容器中对象的数量,从而导致异常。
单线程解决方法:
在遍历的过程中把需要删除的对象保存到一个集合中,等遍历结束后再调用removeAll()方法来删除,或者使用iter.remove()方法。
多线程解决方法:
1)用线程安全的容器来代替非线程安全的容器:ConcurrentHashMap和CopyOnWriteArrayList等。
2)在使用迭代器遍历容器时对容器的操作放到synchronized代码块中,但是当引用程序并发程度比较高时,严重影响程序的性能。
Iterator与ListIterator区别:
1)Iterator只能正向遍历集合,适用于获取移除元素。
2)ListIterator继承于Iterator,专门针对List,可以从两个方向来遍历List,同时支持元素的修改。
3)ListIterator有add()方法,Iterator没有
参考:https://blog.csdn.net/longshengguoji/article/details/41551491