JAVA中ListIterator和Iterator详解与辨析
生活随笔
收集整理的這篇文章主要介紹了
JAVA中ListIterator和Iterator详解与辨析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在使用java集合的時候,都需要使用Iterator。但是java集合中還有一個迭代器ListIterator,
在使用List、ArrayList、LinkedList和Vector的時候可以使用。首先看一下Iterator和ListIterator迭代器的方法有哪些。Iterator迭代器包含的方法有:
hasNext():如果迭代器指向位置后面還有元素,則返回 true,否則返回false
next():返回集合中Iterator指向位置后面的元素
remove():刪除集合中Iterator指向位置后面的元素ListIterator迭代器包含的方法有:
add(E e): 將指定的元素插入列表,插入位置為迭代器當前位置之前
hasNext():以正向遍歷列表時,如果列表迭代器后面還有元素,則返回 true,否則返回false
hasPrevious():如果以逆向遍歷列表,列表迭代器前面還有元素,則返回 true,否則返回false
next():返回列表中ListIterator指向位置后面的元素
nextIndex():返回列表中ListIterator所需位置后面元素的索引
previous():返回列表中ListIterator指向位置前面的元素
previousIndex():返回列表中ListIterator所需位置前面元素的索引
remove():從列表中刪除next()或previous()返回的最后一個元素(有點拗口,意思就是對迭代器
使用hasNext()方法時,刪除ListIterator指向位置后面的元素;當對迭代器使用hasPrevious()方法時,
刪除ListIterator指向位置前面的元素)
set(E e):從列表中將next()或previous()返回的最后一個元素返回的最后一個元素更改為指定元素e一.相同點
都是迭代器,當需要對集合中元素進行遍歷不需要干涉其遍歷過程時,這兩種迭代器都可以使用。二.不同點
1.使用范圍不同,Iterator可以應用于所有的集合,Set、List和Map和這些集合的子類型。
而ListIterator只能用于List及其子類型。2.ListIterator有add方法,可以向List中添加對象,而Iterator不能。3.ListIterator和Iterator都有hasNext()和next()方法,可以實現順序向后遍歷,但是ListIterator
有hasPrevious()和previous()方法,可以實現逆向(順序向前)遍歷。Iterator不可以。4.ListIterator可以定位當前索引的位置,nextIndex()和previousIndex()可以實現。Iterator沒有
此功能。5.都可實現刪除操作,但是ListIterator可以實現對象的修改,set()方法可以實現。Iterator僅能遍歷,
不能修改。三:Iterator和ListIterator用法示例ListIterator用法:public class ListIteratorTest {public static void main(String[] args) {// TODO Auto-generated method stubList<String> staff = new LinkedList<>();staff.add("zhuwei");staff.add("xuezhangbin");staff.add("taozhiwei");ListIterator<String> iter = staff.listIterator();String first = iter.next();//刪除zhuweiiter.remove();//把zhuwei改為simei//iter.set("simei");System.out.println("first:"+first);iter.add("xiaobai");//遍歷List元素System.out.println("遍歷List中元素,方法一:");for(String str : staff)System.out.println(str+" ");iter = staff.listIterator();System.out.println("遍歷List中元素,方法二:");while(iter.hasNext()){System.out.println(iter.next());}}}
Iterator和ListIterator區別
List和Set都有iterator()來取得其迭代器。對List來說,你也可以通過listIterator()取得其迭代器, 兩種迭代器在有些時候是不能通用的,Iterator和ListIterator主要區別在以下方面:1. ListIterator有add()方法,可以向List中添加對象,而Iterator不能2. ListIterator和Iterator都有hasNext()和next()方法,可以實現順序向后遍歷,但是ListIterator 有hasPrevious()和previous()方法,可以實現逆向(順序向前)遍歷。Iterator就不可以。3. ListIterator可以定位當前的索引位置,nextIndex()和previousIndex()可以實現。Iterator沒有 此功能。4. 都可實現刪除對象,但是ListIterator可以實現對象的修改,set()方法可以實現。Iierator僅能遍歷, 不能修改。因為ListIterator的這些功能,可以實現對LinkedList等List數據結構的操作。其實,數組對象也可以用 迭代器來實現。Iterator模式是用于遍歷集合類的標準訪問方法。它可以把訪問邏輯從不同類型的集合類中抽象出來,從而 避免向客戶端暴露集合的內部結構。例如,如果沒有使用Iterator,遍歷一個數組的方法是使用索引:for(int i=0; i<array.size(); i++) { ... get(i) ... } 客戶端都必須事先知道集合的內部結構,訪問代碼和集合本身是緊耦合,無法將訪問邏輯從集合類和客戶端 代碼中分離出來,每一種集合對應一種遍歷方法,客戶端代碼無法復用。為解決以上問題,Iterator模式總是用同一種邏輯來遍歷集合:for(Iterator it = c.iterater(); it.hasNext(); ) { ... }奧秘在于客戶端自身不維護遍歷集合的"指針",所有的內部狀態(如當前元素位置,是否有下一個元素) 都由Iterator來維護,而這個Iterator由集合類通過工廠方法生成,因此,它知道如何遍歷整個集合??蛻舳藦牟恢苯雍图项惔蚪坏?#xff0c;它總是控制Iterator,向它發送"向前","向后","取當前元素"的命令, 就可以間接遍歷整個集合。iterator和List的區別
iterator這是一個迭代器,返回的類型是iterator,遍歷的效率高,而且做查詢的時候iterate()會先到 數據庫中把id都取出來。然后真正要遍歷某個對象的時候先到緩存中找,如果找不到,以id為條件再發一條sql到數據庫,這樣如果緩存中 沒有數據,則再查詢數據庫。iterate會查詢2級緩存,iterate()中返回的對象是代理對象。List返回的類型是list,list只會查詢一級緩存。list()中返回的List中每個對象都是原本的對象。查詢的 時候沒遍歷一個對象會產生一條sql。Iterator模式是用于遍歷集合類的標準訪問方法。它可以把訪問邏輯從不同類型的集合類中抽象出來, 從而避免向客戶端暴露集合的內部結構。 例如,如果沒有使用Iterator,遍歷一個數組的方法是使用索引: for(int i=0; i<array.size(); i++) { ... get(i) ... } 客戶端都必須事先知道集合的內部結構,訪問代碼和集合本身是緊耦合,無法將訪問邏輯從集合類和客戶端代碼 中分離出來,每一種集合對應一種遍歷方法,客戶端代碼無法復用。更恐怖的是,如果以后需要把ArrayList更換為LinkedList,則原來的客戶端代碼必須全部重寫。為解決以上問題,Iterator模式總是用同一種邏輯來遍歷集合:for(Iterator it = c.iterater(); it.hasNext(); ) { ... } 奧秘在于客戶端自身不維護遍歷集合的"指針",所有的內部狀態(如當前元素位置,是否有下一個元素) 都由Iterator來維護,而這個Iterator由集合類通過工廠方法生成,因此,它知道如何遍歷整個集合。 Collection ? c ? = ? new ? ArrayList(); ??c.add("abc"); ??c.add("xyz"); ??for(Iterator ? it ? = ? c.iterator(); ? it.hasNext(); ? ) ? { ??String ? s ? = ? (String)it.next(); ??System.out.println(s); ??} ? ??如果你把第一行代碼的ArrayList換成LinkedList或Vector,剩下的代碼不用改動一行就能編譯,而且功能 不變,這就是針對抽象編程的原則:對具體類的依賴性最小。Iterator 用來遍歷 Set 和 List 集合,而 ListIterator 只能遍歷 List; Iterator 只可以向前 遍歷,而 LIstIterator 可以雙向遍歷;ListIterator 從 Iterator 接口繼承,然后添加了一些額外的功能,比如添加一個元素、替換一個元素、 獲取前面或后面元素的索引位置。?
總結
以上是生活随笔為你收集整理的JAVA中ListIterator和Iterator详解与辨析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中ArrayList和Linke
- 下一篇: ThreadLocal类与Synchon