簡而言之,集合的遍歷若是用for來進行的話,須要知道集合的內部構造,想遍歷數組的時候同樣,須要索引有序。可是例如set集合是無序的,使用for遍歷不了。這時須要迭代器來遍歷,把集合中全部的元素都找出來。java
迭代器(Iterator)模式,又叫作遊標(Cursor)模式。迭代器提供一種對容器對象中的各個元素進行訪問的方法,而又不需暴露該對象的內部細節。
從定義可見,迭代器模式是爲容器而生。 很明顯,對容器對象的訪問必然涉及到遍歷算法。你能夠將遍歷方法寫到容器對象中去(內部迭代器);或者根本不去提供什麼遍歷算法,讓使用容器的人本身去實現去吧(外部迭代器)。這兩種狀況好像都可以解決問題。 然而在前一種狀況,容器承受了過多的功能,它不只要負責本身「容器」內的元素維護(添加、刪除等等),並且還要提供遍歷自身的接口;並且因爲遍歷狀態保存的問題,不能對同一個容器對象同時進行多個遍歷。第二種方式卻是省事,卻又將容器的內部細節暴露無遺。
而迭代器模式的出現,很好的解決了上面兩種狀況的弊端。
因爲迭代器模式自己的規定比較鬆散,因此具體實現也就五花八門。咱們先來列舉下迭代器模式的實現方式。
1.迭代器角色定義了遍歷的接口,可是沒有規定由誰來控制迭代。在Java collection的應用中,是由客戶程序來控制遍歷的進程,被稱爲外部迭代器;
還有一種實現方式即是由迭代器自身來控制迭代,被稱爲內部迭代器。
外部迭代器要比內部迭代器靈活、強大,並且內部迭代器在java語言環境中,可用性很弱
2.在迭代器模式中沒有規定誰來實現遍歷算法。好像理所固然的要在迭代器角色中實現。由於既便於一個容器上使用不一樣的遍歷算法,也便於將一種遍歷算法應用於不一樣的容器。
可是這樣就破壞掉了容器的封裝——容器角色就要公開本身的私有屬性,在java中便意味着向其餘類公開了本身的私有屬性。
那咱們把它放到容器角色裏來實現好了。這樣迭代器角色就被架空爲僅僅存放一個遍歷當前位置的功能。
可是遍歷算法便和特定的容器牢牢綁在一塊兒了。
而在Java Collection的應用中,提供的具體迭代器角色是定義在容器角色中的內部類。
這樣便保護了容器的封裝。可是同時容器也提供了遍歷算法接口,你能夠擴展本身的迭代器。算法