首頁 > Java > java教程 > 主體

關於Iterator迭代器的詳細教學

Y2J
發布: 2017-05-12 09:25:32
原創
1508 人瀏覽過

迭代器是一種模式,它可以使得對於序列類型的資料結構的遍歷行為與被遍歷的物件分離,接下來透過本文給大家分享Java Iterator迭代器_動力節點Java學院整理,需要的朋友參考下吧

迭代器是一種模式,它可以使得對於序列類型的資料結構的遍歷行為與被遍歷的物件分離,即我們無需關心該序列的底層結構是什麼樣子的。只要拿到這個物件,使用迭代器就可以遍歷這個物件的內部.

1.Iterator

Java提供一個專門的迭代器<>Iterator,我們可以對某個序列實作該interface,來提供標準的Java迭代器。 Iterator介面實作後的功能是「使用」迭代器.

文件定義:

Package java.util;
 publicinterface Iterator<E> {
 boolean hasNext();//判断是否存在下一个对象元素
 E next();
 void remove();
 }
 Package java.util;  
 public interface Iterator<E> { 
   boolean hasNext();//判断是否存在下一个对象元素 
   E next(); 
   void remove(); 
 }
登入後複製

 2. Iterable

Java中也提供了一個Iterable接口,Iterable接口實現後的功能是「返回」一個迭代器,我們常用的實現了該接口的子接口有: Collection< E>, Deque, List, Queue, Set 等.該介面的iterator()方法傳回一個標準的Iterator實現。實作這個介面允許物件成為 Foreach 語句的目標。就可以透過Foreach語法遍歷你的底層序列。

Iterable介麵包含一個能夠產生Iterator的iterator()方法,而Iterable介面被foreach用來在序列中移動。因此如果創建了任何實作Iterable介面的類,都可以將它用於foreach語句中。

文件定義: 

Package java.lang; 
 import java.util.Iterator;
 public interface Iterable<T> {
 Iterator<T> iterator();
 }
登入後複製

  文件定義:   

 Package java.lang;   
 import java.util.Iterator;  
 public interface Iterable<T> {  
   Iterator<T> iterator();  
 }
登入後複製

使用Iterator的簡單範例 

 import java.util.*; 
 publicclass TestIterator { 
 public static void main(String[] args) {
 List list=new ArrayList(); 
 Map map=new HashMap(); 
 for(int i=0;i<10;i++){ 
 list.add(new String("list"+i) ); 
 map.put(i, new String("map"+i)); 
 } 
 Iterator iterList= list.iterator();//List接口实现了Iterable接口 
 while(iterList.hasNext()){ 
 String strList=(String)iterList.next(); 
 System.out.println(strList.toString()); 
 } 
 Iterator iterMap=map.entrySet().iterator(); 
 while(iterMap.hasNext()){ 
 Map.Entry strMap=(Map.Entry)iterMap.next(); 
 System.out.println(strMap.getValue());
 }
 }
 }
登入後複製

 使用Iterator的簡單範例  ##

import java.util.*;   
 public class TestIterator {   
  public static void main(String[] args) {   
    List list=new ArrayList();   
    Map map=new HashMap();   
    for(int i=0;i<10;i++){   
     list.add(new String("list"+i) );   
      map.put(i, new String("map"+i));   
    }   
    Iterator iterList= list.iterator();//List接口实现了Iterable接口   
     while(iterList.hasNext()){ 
   String strList=(String)iterList.next();   
      System.out.println(strList.toString());   
    }   
   Iterator iterMap=map.entrySet().iterator();   
    while(iterMap.hasNext()){   
     Map.Entry strMap=(Map.Entry)iterMap.next();   
      System.out.println(strMap.getValue()); 
   
    } 
  } 
 }
登入後複製

介面Iterator在不同的子介面中會根據情況進行功能的擴展,例如針對List的迭代器ListIterator,該迭代器只能用於各種List類別的存取。 ListIterator可以雙向移動。新增了previous()等方法.


3. Iterator與泛型搭配

Iterator對集合類別中的任何一個實作類,都可以傳回這樣一個Iterator物件。可以適用於任何一個類別。


因為集合類別(List和Set等)可以裝入的物件的型別是不確定的,從集合中取出時都是

Object類別類型,用時都需要進行強制轉換,這樣會很麻煩,用上泛型,就是提前告訴集合確定要裝入集合的類型,這樣就可以直接使用而不用顯示類型轉換.非常方便.

4.foreach和Iterator的關係

for each是jdk5.0

新增加上的一個迴圈結構,可以用來處理集合中的每個元素而不用考慮集合定下標。 格式如下

for(variable:collection){ statement; }
登入後複製

定義一個

變數用於暫存集合中的每一個元素,並執行對應的語句(區塊)。 collection必須是一個陣列或是實作了lterable介面的類別物件。

 上面的範例使用泛型和forEach的寫法: 

import java.util.*;
 public class TestIterator {  
 public static void main(String[] args) {
 List<String> list=new ArrayList<String> (); 
 for(int i=0;i<10;i++){ 
 list.add(new String("list"+i) ); 
 } 
 for(String str:list){
 System.out.println(str); 
 }
 }
登入後複製

 上面的範例使用泛型和forEach的寫法:    

import java.util.*; 
 public class TestIterator {  
  public static void main(String[] args) {  
    List<String> list=new ArrayList<String> ();   
    for(int i=0;i<10;i++){ 
      list.add(new String("list"+i) ); 
    } 
    for(String str:list){ 
     System.out.println(str); 
    }  
 }
登入後複製

#可以看出,使用for each迴圈語句的優點在於更簡潔,更不容易出錯,也不必關心下標的起始值和終止值。 forEach不是關鍵字,關鍵字還是for,語句是由iterator實現的,他們最大的不同之處就在於remove()方法上。一般呼叫

刪除和新增方法都是具體集合的方法,例如:

List list = new ArrayList();
list.add(...); list.remove(...);
登入後複製

但是,如果在循环的过程中调用集合的remove()方法,就会导致循环出错,因为循环过程中list.size()的大小变化了,就导致了错误。 所以,如果想在循环语句中删除集合中的某个元素,就要用迭代器iterator的remove()方法,因为它的remove()方法不仅会删除元素,还会维护一个标志,用来记录目前是不是可删除状态,例如,你不能连续两次调用它的remove()方法,调用之前至少有一次next()方法的调用。forEach就是为了让用iterator循环访问的形式简单,写起来更方便。当然功能不太全,所以但如有删除操作,还是要用它原来的形式。

4 使用for循环与使用迭代器iterator的对比

采用ArrayList对随机访问比较快,而for循环中的get()方法,采用的即是随机访问的方法,因此在ArrayList里,for循环较快

采用LinkedList则是顺序访问比较快,iterator中的next()方法,采用的即是顺序访问的方法,因此在LinkedList里,使用iterator较快。从数据结构角度分析,for循环适合访问顺序结构,可以根据下标快速获取指定元素.而Iterator 适合访问链式结构,因为迭代器是通过next()和Pre()来定位的.可以访问没有顺序的集合.

而使用 Iterator 的好处在于可以使用相同方式去遍历集合中元素,而不用考虑集合类的内部实现(只要它实现了 java.lang.Iterable 接口),如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 Set 来组织数据,那遍历元素的代码不用做任何修改,如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整,因为List有序,Set无序,结构不同,他们的访问算法也不一样.

【相关推荐】

1. Java免费视频教程

2. YMP在线手册

3. JAVA初级入门视频教程

以上是關於Iterator迭代器的詳細教學的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!