java.util.Iterator(迭代器)

來源:互聯網
上載者:User



Iterator

(迭代器)



作者:
zccst

 

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() ... } 

以上兩種方法用戶端都必須事Crowdsourced Security Testing道集合的內部結構,存取碼和集合本身是緊耦合,無法將訪問邏輯從集合類和用戶端代碼中分離出來,每一種集合對應一種遍曆方法,用戶端代碼無法複用。而且,如果以後需要把
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

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.