1. 程式人生 > 實用技巧 >JavaSE進階--Iterator迭代器

JavaSE進階--Iterator迭代器

Iterator迭代器

1.1 Iterator介面


在程式開發中,經常需要遍歷集合中的所有元素。針對這種需求,JDK專門提供了一個介面java.util.IteratorIterator介面也是Java集合中的一員,但它與CollectionMap介面有所不同,Collection介面與Map介面主要用於儲存元素,而Iterator主要用於迭代訪問(即遍歷)Collection中的元素,因此Iterator物件也被稱為迭代器。


想要遍歷Collection集合,那麼就要獲取該集合迭代器完成迭代操作,下面介紹一下獲取迭代器的方法:

  • public Iterator iterator()
    : 獲取集合對應的迭代器,用來遍歷集合中的元素的。


下面介紹一下迭代的概念:

  • 迭代即Collection集合元素的通用獲取方式。在取元素之前先要判斷集合中有沒有元素,如果有,就把這個元素取出來,繼續在判斷,如果還有就再取出出來。一直把集合中的所有元素全部取出。這種取出方式專業術語稱為迭代。


Iterator介面的常用方法如下:

  • public E next():返回迭代的下一個元素。
  • public boolean hasNext():如果仍有元素可以迭代,則返回 true。

迭代器的使用步驟:
        1.使用集合的方法iterator()獲取迭代器物件實現類物件,使用Iterator介面接收(多型)

        2. 使用Iterator介面中的hasNext()方法,判斷是否還有下一個元素
        3. 使用Iterator介面的Next()方法,取出集合中的下一個元素
接下來我們通過案例學習如何使用Iterator迭代集合中元素:

package 集合和泛型.Iterator;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;

/**
 * java.util.Iterator介面:迭代器
 *   Iterator介面的常用方法如下:
 *      public E next():返回迭代的下一個元素。
 *      public boolean hasNext():如果仍有元素可以迭代,則返回 true。
 *  Iterator迭代器,是一個介面,我們無法直接使用,需要Iterator介面的實現類物件,獲取實現類的方式比較特殊
 *  Collection介面中有一個iterator方法,這個方法返回的是迭代器物件
 */
public class Demo01Iterator {
    public static void main(String[] args) {
        demo01();
    }
    public static void demo01(){
        // 迭代器的使用步驟:
        // 1.使用集合的方法iterator()獲取迭代器物件實現類物件,使用Iterator介面接收(多型)
        // 2. 使用Iterator介面中的hasNext()方法,判斷是否還有下一個元素
        // 3. 使用Iterator介面的Next()方法,取出集合中的下一個元素

        Collection<String> coll = new HashSet<>();  // 建立集合物件
        coll.add("a");
        coll.add("b");
        coll.add("c");
        coll.add("d");

        Iterator<String> iterator = coll.iterator();    // 建立迭代器
        while (iterator.hasNext()){                     // 使用迭代器遍歷
            String s = iterator.next();
            System.out.println(s);
        }
    }
}

tips::在進行集合元素取出時,如果集合中已經沒有元素了,還繼續使用迭代器的next方法,將會發生java.util.NoSuchElementException沒有集合元素的錯誤。

1.2 迭代器的實現原理


Iterator迭代器物件在遍歷集合時,內部採用指標的方式來跟蹤集合中的元素,為了能更好地理解迭代器的工作原理,接下來通過一個圖例來演示Iterator物件迭代元素的過程:



在呼叫Iterator的next方法之前,迭代器的索引位於第一個元素之前,不指向任何元素,當第一次呼叫迭代器的next方法後,迭代器的索引會向後移動一位,指向第一個元素並將該元素返回,當再次呼叫next方法時,迭代器的索引會指向第二個元素並將該元素返回,依此類推,直到hasNext方法返回false,表示到達了集合的末尾,終止對元素的遍歷。

1.3 增強for


增強for迴圈(也稱for each迴圈)是JDK1.5以後出來的一個高階for迴圈,專門用來遍歷陣列和集合的。它的內部原理其實是個Iterator迭代器,所以在遍歷的過程中,不能對集合中的元素進行增刪操作。


格式:

for(元素的資料型別  變數 : Collection集合or陣列){ 
  	//寫操作程式碼
}


它用於遍歷Collection和陣列。通常只進行遍歷元素,不要在遍歷的過程中對集合元素進行增刪操作。

練習1:遍歷陣列

public class NBForDemo1 {
    public static void main(String[] args) {
		int[] arr = {3,5,6,87};
       	//使用增強for遍歷陣列
		for(int a : arr){//a代表陣列中的每個元素
			System.out.println(a);
		}
	}
}

練習2:遍歷集合

public class NBFor {
    public static void main(String[] args) {        
    	Collection<String> coll = new ArrayList<String>();
    	coll.add("小河神");
    	coll.add("老河神");
    	coll.add("神婆");
    	//使用增強for遍歷
    	for(String s :coll){//接收變數s代表 代表被遍歷到的集合元素
    		System.out.println(s);
    	}
	}
}

tips: 新for迴圈必須有被遍歷的目標。目標只能是Collection或者是陣列。新式for僅僅作為遍歷操作出現。