java中為什么要使用迭代器


簡而言之,集合的遍歷如果用for來進行的話,需要知道集合的內部構造,想遍歷數組的時候一樣,需要索引有序。但是例如set集合是無序的,使用for遍歷不了。這時需要迭代器來遍歷,把集合中所有的元素都找出來。

 

 

迭代器(Iterator)模式,又叫做游標(Cursor)模式。迭代器提供一種對容器對象中的各個元素進行訪問的方法,而又不需暴露該對象的內部細節。

從定義可見,迭代器模式是為容器而生。  很明顯,對容器對象的訪問必然涉及到遍歷算法。你可以將遍歷方法寫到容器對象中去(內部迭代器);或者根本不去提供什么遍歷算法,讓使用容器的人自己去實現去吧(外部迭代器)。這兩種情況好像都能夠解決問題。 然而在前一種情況,容器承受了過多的功能,它不僅要負責自己“容器”內的元素維護(添加、刪除等等),而且還要提供遍歷自身的接口;而且由於遍歷狀態保存的問題,不能對同一個容器對象同時進行多個遍歷。第二種方式倒是省事,卻又將容器的內部細節暴露無遺。   

而迭代器模式的出現,很好的解決了上面兩種情況的弊端。

由於迭代器模式本身的規定比較松散,所以具體實現也就五花八門。我們先來列舉下迭代器模式的實現方式。  

1.迭代器角色定義了遍歷的接口,但是沒有規定由誰來控制迭代。在Java collection的應用中,是由客戶程序來控制遍歷的進程,被稱為外部迭代器;
還有一種實現方式便是由迭代器自身來控制迭代,被稱為內部迭代器。
外部迭代器要比內部迭代器靈活、強大,而且內部迭代器在java語言環境中,可用性很弱

2.在迭代器模式中沒有規定誰來實現遍歷算法。好像理所當然的要在迭代器角色中實現。因為既便於一個容器上使用不同的遍歷算法,也便於將一種遍歷算法應用於不同的容器。
但是這樣就破壞掉了容器的封裝——容器角色就要公開自己的私有屬性,在java中便意味着向其他類公開了自己的私有屬性。  
那我們把它放到容器角色里來實現好了。這樣迭代器角色就被架空為僅僅存放一個遍歷當前位置的功能。
但是遍歷算法便和特定的容器緊緊綁在一起了。  
而在Java Collection的應用中,提供的具體迭代器角色是定義在容器角色中的內部類。
這樣便保護了容器的封裝。但是同時容器也提供了遍歷算法接口,你可以擴展自己的迭代器。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM