java.util.Iterator細說

Iterator (迭代器)

Java.util.Iterator 接口描述的是以統一的方式對各種集合元素進行遍歷 / 迭代的工具,也稱“迭代器”。

迭代器( Iterator )模式,又叫做遊標( Cursor )模式,是用於遍歷集合類的標準訪問方法。 GOF 給出的定義爲:提供一種方法訪問一個容器(Container )對象中各個元素,而又不需暴露該對象的內部細節。

java.util.Iterator 接口的定義:

      public interface Iterator {          

boolean hasNext();           // 是否有下一個,有返回 true ,否則返回 false

Object next();                // 遍歷到下一個

void remove();               // 刪除當前元素

}  

不難看出,允許在“遍歷”過程中移除集合中的(當前遍歷到的那個)元素。

其實依賴前兩個方法就能完成遍歷,典型的代碼如下:

      for(Iterator it = c.iterator(); it.hasNext(); ) {           

Object o = it.next();           // 對 o 的操作 ...       

}  

每一種集合類返回的 Iterator 具體類型可能不同, Array 可能返回 ArrayIterator , Set 可能返回 SetIterator , Tree 可能返回 TreeIterator ,但是它們都實現了 Iterator 接口,因此,客戶端不關心到底是哪種 Iterator ,它只需要獲得這個 Iterator 接口即可,這就是面向對象的優勢。

 

注:試想,如果沒有使用 Iterator ,遍歷一個數組的方法是使用索引:

      for(int i=0; i<array.size(); i++) { ... get(i) ... }  

而訪問一個鏈表( LinkedList )又必須使用 while 循環:

      while((e=e.next())!=null) { ... e.data() ... }  

以上兩種方法客戶端都必須事先知道集合的內部結構,訪問代碼和集合本身是緊耦合,無法將訪問邏輯從集合類和客戶端代碼中分離出來,每一種集合對應一種遍歷方法,客戶端代碼無法複用。而且,如果以後需要把 ArrayList 更換爲 LinkedList ,則原來的客戶端代碼必須全部重寫。

 

 

例如 1 : TestIterator.java

import java.util.Date;

import java.util.ArrayList;

import java.util.Vector;

import java.util.Iterator;

 

public class TestIterator{

       public static void main(String[] args) {

              ArrayList a = new ArrayList();

              a.add("China");

              a.add("USA");

              a.add("Korea");

              Iterator  it = a.iterator();             // 用 it 完成遍歷

              while(it.hasNext()){

                     String country = (String)it.next();  // 這樣就返回 String 類型

                     System.out.println(country);  

              }            

              

              Vector v = new Vector();

              v.addElement(new Date());    

              v.addElement(new Date(200008755554L));

              it = v.iterator();

              while(it.hasNext()){

                     Date time = (Date)it.next();

                     System.out.println(time);      

              }                   

       }

}

輸出結果:

China

USA

Korea

Sun Dec 27 18:53:27 CST 2009

Tue May 04 05:59:15 CST 1976

 

例如 2 : Person.java 、 TestIterator2.java

注:本例有兩個文件,如果放在同一個包裏可以直接使用;如果在不同包,需用 import 一下。

(1) Person.java

package test.src.test;  // 這是我的 Person.java 文件所在包,需根據實際情況修改

public class Person{

       private String name;

       private int age;

       

       public Person(String name,int age){

              this.name = name;

              this.age = age;

       }

       public void setName(String name){

              this.name = name;

       }

       public String getName(){

              return name;   

       }

       public void setAge(int age){

              this.age = age;

       }

       public int getAge(){

              return age;      

       }

       public String toString(){

              return "Name: " + name + "/tAge: " + age; 

       }     

}

(2) TestIterator2.java

package test.src.test;          // 同理,需根據實際情況修改

import java.util.Vector;

import java.util.Iterator;

public class TestIterator2{

       public static void main(String[] args) {

              Vector v = new Vector();

              v.addElement(new Person(" 張三 ",18));

              v.addElement(new Person(" 李四 ",26));

              v.addElement(new Person(" 王五 ",34));

              v.addElement(new Person(" 趙六 ",40));

 

              Iterator it = v.iterator();

              while(it.hasNext()){  //while 循環輸出每一個元素

                     Person p = (Person)it.next();

                     System.out.println(p);    

                     if(p.getName().equals(" 王五 ")){

                            p.setAge(p.getAge() + 50);

                     }else if(p.getName().equals(" 李四 ")){

                            it.remove();

                     }                   

              }     

              System.out.println("-----------------------");  

              for(int i=0;i<v.size();i++)

                     System.out.println(v.elementAt(i));      

       }

}

 

輸出結果:

Name: 張三   Age: 18

Name: 李四   Age: 26

Name: 王五   Age: 34

Name: 趙六   Age: 40

-----------------------

Name: 張三   Age: 18

Name: 王五   Age: 84

Name: 趙六   Age: 40

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章