迭代器Iterator,ConcurrentModificationException异常

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

猜你喜欢

转载自blog.csdn.net/weixin_38108266/article/details/81876931
今日推荐