1. 程式人生 > 其它 >迭代器Iterator

迭代器Iterator

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

接下來我們通過案例學習如何使用Iterator迭代集合中元素:

public class IteratorDemo {
      public static
void main(String[] args) { // 使用多型方式 建立物件 Collection<String> coll = new ArrayList<String>(); // 新增元素到集合 coll.add("串串星人"); coll.add("吐槽星人"); coll.add("汪星人"); //遍歷 //使用迭代器 遍歷 每個集合物件都有自己的迭代器 Iterator<String> it = coll.iterator();
// 泛型指的是 迭代出 元素的資料型別 while(it.hasNext()){ //判斷是否有迭代元素 String s = it.next();//獲取迭代出的元素 System.out.println(s); } } }

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

迭代器的實現原理

我們在之前案例已經完成了Iterator遍歷集合的整個過程。當遍歷集合時,首先通過呼叫t集合的iterator()方法獲得迭代器物件,然後使用hashNext()方法判斷集合中是否存在下一個元素,如果存在,則呼叫next()方法將元素取出,否則說明已到達了集合末尾,停止遍歷元素。

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

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

Entry鍵值對物件

我們已經知道, Map 中存放的是兩種物件,一種稱為key(鍵),一種稱為value(值),它們在在Map 中是一一對應關係,這一對物件又稱做 Map 中的一個 Entry(項) 。 Entry 將鍵值對的對應關係封裝成了物件。即鍵值對物件,這樣我們在遍歷 Map 集合時,就可以從每一個鍵值對( Entry )物件中獲取對應的鍵與對應的值。

既然Entry表示了一對鍵和值,那麼也同樣提供了獲取對應鍵和對應值得方法:

public K getKey() :獲取Entry物件中的鍵。 
public V getValue() :獲取Entry物件中的值。

在Map集合中也提供了獲取所有Entry物件的方法:

public Set<Map.Entry<K,V>> entrySet() : 獲取到Map集合中所有的鍵值對物件的集合(Set集合)。

Map集合遍歷鍵值對方式

鍵值對方式:即通過集合中每個鍵值對(Entry)物件,獲取鍵值對(Entry)物件中的鍵與值。

操作步驟與圖解:

1. 獲取Map集合中,所有的鍵值對(Entry)物件,以Set集合形式返回。方法提示: entrySet() 。

2. 遍歷包含鍵值對(Entry)物件的Set集合,得到每一個鍵值對(Entry)物件。

3. 通過鍵值對(Entry)物件,獲取Entry物件中的鍵與值。 方法提示: getkey() getValue()

public class MapDemo02 { 
    public static void main(String[] args) { 
        // 建立Map集合物件 
        HashMap<String, String> map = new HashMap<String,String>(); 
        // 新增元素到集合 
        map.put("胡歌", "霍建華"); 
        map.put("郭德綱", "于謙"); 
        map.put("薛之謙", "大張偉"); 
        // 獲取 所有的 entry物件 
        entrySet Set<Entry<String,String>> entrySet = map.entrySet(); 
        // 遍歷得到每一個entry物件 
        for (Entry<String, String> entry : entrySet) { 
          // 解析 
          String key = entry.getKey(); 
          String value = entry.getValue(); 
          System.out.println(key+"的CP是:"+value); 
        } 
    } 
}

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