Iterator接口(迭代器)
前言
- 在程序開發中,經常需要遍歷集合中的所有元素。針對這種需求,JDK專門提供了一個接口java.util.Iterator。Iterator接口也是Java集合中的一員,但它與Collection、Map接口有所不同,Collection接口與Map接口主要用於存儲元素,而Iterator主要用於迭代訪問(即遍歷)Collection中的元素
- 因此Iterator對象也被稱為迭代器,使你能夠通過循環來得到或刪除集合的元素。ListIterator 繼承了Iterator,以允許雙向遍歷列表和修改元素。
原理
- 在獲取迭代器的時候,會創建一個原集合的副本。同時會創建一個指針指向迭代器迭代集合的起始位置。
- 即Collection集合元素的通用獲取方式。在取元素之前先要判斷集合中有沒有元素,如果有,就把這個元素取出來,繼續再判斷,如果還有就再取出出來。一直把集合中的所有元素全部取出。
方法
- 想要遍歷Collection集合(比如ArrayList<>),那么就要獲取該集合的迭代器完成迭代操作,下面具體介紹實現步驟:
- hasNext() :該方法會判斷集合對象是否還有下一個元素,如果已經是最后一個元素則返回false。如果仍有元素可以迭代,則返回 true。
- next():把迭代器的指向移到下一個位置,同時,該方法返回迭代的下一個元素。
- remove() 從迭代器指向的集合中移除迭代器返回的最后一個元素。
測試
gaoji.jihe.DemoIterator
/* java.util.Iterator接口:迭代器(對集合進行遍歷) 有兩個常用的方法 boolean hasNext() 如果仍有元素可以迭代,則返回 true。 判斷集合中還有沒有下一個元素,有就返回true,沒有就返回false E next() 返回迭代的下一個元素。 取出集合中的下一個元素 Iterator是一個接口,我們無法直接使用,需要使用Iterator接口的實現類對象,獲取實現類的方式比較特殊 Collection接口中有一個方法,叫iterator(),這個方法返回的就是迭代器的實現類對象 Iterator<E> iterator() 返回在此 collection 的元素上進行迭代的迭代器。 迭代器的使用步驟(重點): 1.使用集合中的方法iterator()獲取迭代器的實現類對象,使用Iterator接口接收(多態) 2.使用Iterator接口中的方法hasNext判斷還有沒有下一個元素 3.使用Iterator接口中的方法next取出集合中的下一個元素 */ public class DemoIterator { public static void main(String[] args) { //創建一個集合對象 Collection<String> coll = new ArrayList<>(); //往集合中添加元素 coll.add("姚明"); coll.add("科比"); coll.add("麥迪"); coll.add("詹姆斯"); coll.add("艾弗森"); /* 1.使用集合中的方法iterator()獲取迭代器的實現類對象,使用Iterator接口接收(多態) 注意: Iterator<E>接口也是有泛型的,迭代器的泛型跟着集合走,集合是什么泛型,迭代器就是什么泛型 */ //多態 接口 實現類對象 Iterator<String> iterator = coll.iterator(); /* 發現使用迭代器取出集合中元素的代碼,是一個重復的過程 所以我們可以使用循環優化 不知道集合中有多少元素,使用while循環 循環結束的條件,hasNext方法返回false */ while (iterator.hasNext()) { String e = iterator.next(); System.out.print(e + " ");//姚明 科比 麥迪 詹姆斯 艾弗森 } System.out.println("maven默認編譯jdk版本1.5需要自己配置成1.8"); for (Iterator<String> it2 = coll.iterator(); it2.hasNext(); ) { String e = it2.next(); System.out.print(e + " ");//姚明 科比 麥迪 詹姆斯 艾弗森 } } }
maven需要自己配置成jdk1.8編譯
<!--maven默認編譯jdk版本1.5需要自己配置成1.8--> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.1</version> <!--版本2019年10月--> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build>
增強for循環
增強for循環:底層使用的也是迭代器,使用for循環的格式,簡化了迭代器的書寫
是JDK1.5之后出現的新特性
Collection<E> extends Iterable<E>: 所有的單列集合都可以使用增強for
public interface Iterable<T>實現這個接口允許對象成為 "foreach" 語句的目標。
增強for循環:用來遍歷集合和數組
格式:
for(集合/數組的數據類型 變量名: 集合名/數組名){
sout(變量名);
}
public class Demo02Foreach { public static void main(String[] args) { demo02(); } //使用增強for循環遍歷集合 private static void demo02() { ArrayList<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); list.add("ddd"); for(String s : list){ System.out.println(s); } } //使用增強for循環遍歷數組 private static void demo01() { int[] arr = {1,2,3,4,5}; for(int i:arr){ System.out.println(i); } } }
=======================================
參考資料:
Iterator接口(迭代器)