首先,爲何須要使用迭代器Iterator,原有的for循環和for each不能知足需求嗎?數組
那是由於Iterator模式是用於遍歷集合類的標準訪問方法。它能夠把訪問邏輯從不一樣類型的集合類中抽象出來,從而避免向客戶端暴露集合的內部結構。指針
例如,若是沒有使用Iterator,遍歷一個數組的方法是使用索引:
for(int i=0; i<array.size(); i++) { ... get(i) ... }
客戶端都必須事先知道集合的內部結構,訪問代碼和集合自己是緊耦合,沒法將訪問邏輯從集合類和客戶端代碼中分離出來,每一種集合對應一種遍歷方法,客戶端代碼沒法複用。
更恐怖的是,若是之後須要把ArrayList更換爲LinkedList,則原來的客戶端代碼必須所有重寫。
爲解決以上問題,Iterator模式老是用同一種邏輯來遍歷集合:對象
for(Iterator it = c.iterater(); it.hasNext(); ) { ... }索引
奧祕在於客戶端自身不維護遍歷集合的"指針",全部的內部狀態(如當前元素位置,是否有下一個元素)都由Iterator來維護,而這個Iterator由集合類經過工廠方法生成,所以,它知道如何遍歷整個集合。get
客戶端從不直接和集合類打交道,它老是控制Iterator,向它發送"向前","向後","取當前元素"的命令,就能夠間接遍歷整個集合。it
下面再看看Iterator和ListIterator的異同點:io
1.相同點for循環
都是迭代器,均可以遍歷集合中的元素。List
2.區別循環
1)使用範圍不一樣:Iterator能遍歷set、list集合,而ListIterator只能遍歷list集合。
2)遍歷順序有區別:ListIterator和Iterator都有hasNext()和next()方法,能夠實現順序向後遍歷,可是ListIterator有hasPrevious()和previous()方法,能夠實現逆向(順序向前)遍歷。Iterator就不能夠。
3)是否能定位當前索引位置:ListIterator能夠定位當前的索引位置,nextIndex()和previousIndex()能夠實現。Iterator沒有此功能。
4)是否能修改對象:均可實現刪除對象,可是ListIterator能夠實現對象的修改,set()方法能夠實現。Iierator僅能遍歷,不能修改。
5) 是否能添加對象:ListIterator有add()方法,能夠向List中添加對象,而Iterator不能。