- Java程序員面試筆試寶典(第2版)
- 何昊等編著
- 830字
- 2022-06-17 16:01:04
3.7 迭代器
迭代器是一個對象,它的工作是遍歷并選擇序列中的對象,它提供了一種訪問一個容器(container)對象中各個元素,而又不需暴露該對象內部細節的方法。通過迭代器,開發人員不需要了解容器底層的結構,就可以實現對容器的遍歷。由于創建迭代器的代價小,因此迭代器通常被稱為輕量級的容器。
迭代器的使用主要有以下幾個方面的注意事項:
1)使用容器的iterator()方法返回一個Iterator,然后通過Iterator的next()方法返回第一個元素。
2)使用Iterator的hasNext()方法判斷容器是否還有元素,如果有,可以使用next()方法獲取下一個元素。
3)可以通過remove()方法刪除迭代器返回的元素。
4)Iterator支持派生的兄弟成員。ListIterator只存在于List中,支持在迭代期間向List中添加或刪除元素,并且可以在List中雙向滾動。
Iterator的使用方法如下例所示:

程序的運行結果為:

在使用iterator的時候經常會遇到ConcurrentModificationException異常,這通常是由于在使用Iterator遍歷容器的同時又對容器作增加或刪除操作所導致的,或者由于多線程操作導致。下例主要介紹單線程拋出ConcurrentModificationException的情況:


程序的運行結果為:

拋出上述異常的主要原因是當調用容器的Iterator()方法返回Iterator對象的時候,把容器中包含對象的個數賦值給了一個變量expectedModCount,在調用next()方法的時候會比較變量expectedModCount與容器中實際對象的個數modCount的值是否相等,如果二者不相等,則會拋出ConcurrentModificationException異常,因此在使用Iterator遍歷容器的過程中,如果對容器進行增加或刪除操作,就會改變容器中對象的數量,因此會導致拋出異常。解決方法為:在遍歷的過程中把需要刪除的對象保存到一個集合中,等遍歷結束后再調用removeAll方法來刪除,或者使用iter.remove方法。
以上主要介紹了單線程的解決方案,那么多線程訪問容器的過程中拋出ConcurrentModification-Exception異常又該怎么解決呢?
1)在JDK1.5版本引入了線程安全的容器,比如ConcurrentHashMap和CopyOnWriteArrayList等。可以使用這些線程安全的容器來代替非線程安全的容器;
2)在使用迭代器遍歷容器的時候對容器的操作放到synchronized代碼塊中,但是當引用程序并發程度比較高的時候,這會嚴重影響程序的性能。
引申:Iterator與ListIterator有什么區別?
Iterator只能正向遍歷集合,適用于獲取移除元素。ListIerator繼承自Iterator,專門針對List,可以從兩個方向來遍歷List,同時支持元素的修改。
- C++面向對象程序設計(第三版)
- Learning Single:page Web Application Development
- 自制編譯器
- Ext JS Data-driven Application Design
- 動手玩轉Scratch3.0編程:人工智能科創教育指南
- Offer來了:Java面試核心知識點精講(原理篇)
- Web Application Development with R Using Shiny(Second Edition)
- Koa開發:入門、進階與實戰
- 新編Premiere Pro CC從入門到精通
- Spring+Spring MVC+MyBatis整合開發實戰
- C和C++游戲趣味編程
- Julia 1.0 Programming Complete Reference Guide
- C++ Application Development with Code:Blocks
- Django Design Patterns and Best Practices
- Web前端測試與集成:Jasmine/Selenium/Protractor/Jenkins的最佳實踐