Iterator和ListIterator接口的使用和区别
1.Iterator接口
1.1.Iterator接口概述
java.util.Iterator 接口提供遍歷任何 Collection 的接口。我們可以從一個 Collection 中使用迭代器方法來獲取迭代器實例。迭代器取代了 Java 集合框架中的 Enumeration,迭代器允許調(diào)用者在迭代過程中移除元素。
每一個集合都有自己的數(shù)據(jù)結(jié)構(gòu)(就是容器中存儲數(shù)據(jù)的方式),都有特定的取出自己內(nèi)部元素的方式。為了便于操作所有的容器,取出元素。將容器內(nèi)部的取出方式按照一個統(tǒng)一的規(guī)則向外提供,這個規(guī)則就是Iterator接口,使得對容器的遍歷操作與其具體的底層實現(xiàn)相隔離,達(dá)到解耦的效果。
也就說,只要通過該接口就可以取出Collection集合中的元素,至于每一個具體的容器依據(jù)自己的數(shù)據(jù)結(jié)構(gòu),如何實現(xiàn)的具體取出細(xì)節(jié),這個不用關(guān)心,這樣就降低了取出元素和具體集合的耦合性。
1.2Iterator接口方法:
| boolean hasNext() | 每次next之前先調(diào)用此方法探測迭代是否到終點 |
| E next() | 返回當(dāng)前迭代元素,同時迭代游標(biāo)后移 |
| void remove | 刪除最近一次已經(jīng)迭代出去的元素,注意:只有當(dāng)next執(zhí)行完畢后才能調(diào)用remove方法,如果沒有next直接調(diào)用會拋出異常 |
我們使用next迭代出的元素是原來集合元素的拷貝其實Java集合保存的元素實質(zhì)上對象元素的引用,并不是對象的引用,也就是說,迭代的對象是集合里邊引用的拷貝,還是一個引用,那么如果集合里邊保存的元素可以改變,那么可以使用迭代器修改里邊的對象
1.3Iterator接口的使用實例:
1.迭代List集合的例子:
package untl1; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class MyIterator {public static void main(String[] args) {List<Integer> iterator=new ArrayList();//只要是List或者Set實現(xiàn)類都可以這么用p1.add(1);p1.add(2);p1.add(3);p1.add(4);for ( Iterator<Integer> a=iterator.iterator();a.hasNext();) {Integer b=a.next();System.out.println(b);}}} 運行結(jié)果: 1 2 3 42.迭代Map集合例子(通過所有的結(jié)點(結(jié)點都是一個Entry對象)):
package untl1; import java.util.*; public class MyIterator {public static void main(String[] args) {Map<Integer,String> p1=new HashMap<>();p1.put(1,"AA");p1.put(2,"BB");p1.put(3,"CC");p1.put(4,"DD");Set<Map.Entry<Integer,String>> ss=p1.entrySet();//把HashMap里邊的鍵值對看作一個對象,存放在Set集合里邊再在Set集合里邊得到迭代器,以此遍歷for (Iterator<Map.Entry<Integer,String>> a = ss.iterator(); a.hasNext();) {Map.Entry p2=a.next();System.out.println(p2.getKey()+" "+p2.getValue());}}} 運行結(jié)果: 1 AA 2 BB 3 CC 4 DD當(dāng)然我們也可以通過鍵集合來遍歷:
package untl1; import java.util.*; public class MyIterator {public static void main(String[] args) {Map<Integer,String> p1=new HashMap<>();p1.put(1,"AA");p1.put(2,"BB");p1.put(3,"CC");p1.put(4,"DD");Set<Integer> ss=p1.keySet();for (Iterator<Integer> a = ss.iterator(); a.hasNext();) {Integer p2=a.next();System.out.println(p2+" "+p1.get(p2));}}} 運行結(jié)果: 1 AA 2 BB 3 CC 4 DD3.我們使用迭代器邊迭代邊移除集合里邊的元素:
package untl; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; public class MyIterator {public static void main(String[] args) {int i=0;List<String> list=new ArrayList<>();Collections.addAll(list,"aaa","bbb","ccc","ddd");for (Iterator<String> iterator=list.iterator();iterator.hasNext();){String str=iterator.next();System.out.println(str);if(i==1)iterator.remove();i++;}System.out.printf("ArrayList里邊的內(nèi)容為:");System.out.println(list);} } 運行結(jié)果: aaa bbb ccc ddd ArrayList里邊的內(nèi)容為:[aaa, ccc, ddd]2.ListIterator接口
2.1ListIterator接口概述:
java.util.ListIterator是一個功能更加強大的迭代器, 它繼承于Iterator接口,只能用于各種List類型的訪問??梢酝ㄟ^調(diào)用listIterator()方法產(chǎn)生一個指向List開始處的ListIterator, 還可以調(diào)用listIterator(n)方法創(chuàng)建一個一開始就指向列表索引為n的元素處的ListIterator。
2.2ListIterator接口的特點:
1.允許我們向前、向后兩個方向遍歷 List;
2.在遍歷時修改 List 的元素;
3.遍歷時獲取迭代器當(dāng)前游標(biāo)所在位置。
2.3ListIterator接口常用方法:
| hasNext()) | 判斷是否還有下一個元素可以迭代 |
| next() | 返回當(dāng)前迭代器指針指向的元素,并把迭代器指針后移 |
| hasPrevious() | 判斷是否還有上一個元素可以迭代 |
| previous() | 返回當(dāng)前迭代器指針指向的元素,并把迭代器指針q前移 |
| add() | 在集合添加一個元素 |
| set(E e) | 用指定元素替換替換最近返回的元素 |
| remove() | 移除最近返回的元素 |
| nextIndex() | 返回下一個元素的索引 |
2.4.ListIterator接口的使用例子:
package untl; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.ListIterator; public class MyIterator {public static void main(String[] args) {List<String> list=new ArrayList<>();Collections.addAll(list,"aaa","bbb","ccc","ddd");ListIterator<String> listIterator=list.listIterator();for (;listIterator.hasNext();)//從前往后遍歷{String str=listIterator.next();System.out.println(str);}System.out.println("----------------------------------------");listIterator.add("eee");//添加一個元素ListIterator<String> listIterator1=list.listIterator();//由于上一個迭代器已經(jīng)指向最后一個元素所以我們從新獲取一個迭代器boolean bool=listIterator1.hasPrevious();//判斷是否前面有元素System.out.println(bool);String str=listIterator1.next();//把迭代指針向后移動一位System.out.println(str);System.out.println(listIterator1.hasPrevious());System.out.println("----------------------------------------");listIterator1.set("000");//把剛剛迭代所返回的元素進行替換ListIterator<String> listIterator2=list.listIterator();//在獲得指向第一個元素的迭代器for (;listIterator2.hasNext();){System.out.println(listIterator2.next());System.out.println(listIterator2.nextIndex());System.out.println(listIterator2.previousIndex());}System.out.println("----------------------------------------");//由于listIterator2已經(jīng)指向最后一個元素,我們利用下面代碼從后往前遍歷for (;listIterator2.hasPrevious();){String str3=listIterator2.previous();System.out.println(str3);}} } 運行結(jié)果: aaa bbb ccc ddd ---------------------------------------- false aaa true ---------------------------------------- 000 1 0 bbb 2 1 ccc 3 2 ddd 4 3 eee 5 4 ---------------------------------------- eee ddd ccc bbb 000Process finished with exit code 0Iterator和ListIterator接口的區(qū)別
1.Iterator 可以遍歷 Set 和 List集合,而 ListIterator 只能遍歷List。
2.Iterator 只能 單向遍歷,而 ListIterator 可以 雙向遍歷(向前/后遍歷)。
3.ListIterator 實現(xiàn) Iterator 接口,然后添加了一些額外的功能,比如添加一個元素、替換一個元素、獲取前面或后面元素的索引位置。
總結(jié)
以上是生活随笔為你收集整理的Iterator和ListIterator接口的使用和区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Collection和Collectio
- 下一篇: ArrayList集合的使用和源码详细分