1. 程式人生 > >Iterable和迭代器

Iterable和迭代器

Iterable

正是由於每一個容器都有取出元素的功能。這些功能定義都一樣,只不過實現的具體方式不同(因為每一個容器的資料結構不一樣)所以對共性的取出功能進行了抽取,從而出現了Iterator介面。而每一個容器都在其內部對該介面進行了內部類的實現。也就是將取出方式的細節進行封裝。

Jdk1.5之後新增的新介面, Collection的父介面實現了Iterable的類就是可迭代的.並且支援增強for迴圈。該介面只有一個方法即獲取迭代器的方法iterator()可以獲取每個容器自身的迭代器Iterator。(Collection)集合容器都需要獲取迭代器(Iterator)於是在5.0後又進行了抽取將獲取容器迭代器的

iterator()方法放入到了Iterable介面中。Collection介面程序了Iterable,所以Collection體系都具備獲取自身迭代器的方法,只不過每個子類集合都進行了重寫(因為資料結構不同)

2.迭代器的遍歷

第一種方式:while迴圈

 print?

  1. public static void main(String[] args) {  
  2.         ArrayList list = new ArrayList();  
  3.         // 增加:add() 將指定物件儲存到容器中  
  4.         list.add("計算機網路");  
  5.         list.add(
    "現代作業系統");  
  6.         list.add("java程式設計思想");  
  7.         list.add("java核心技術");  
  8.         list.add("java語言程式設計");  
  9.         System.out.println(list);  
  10.         Iterator it = list.iterator();  
  11.         while (it.hasNext()) {  
  12.             String next = (String) it.next();  
  13.             System.out.println(next);  
  14.         }  
  15.     }  

第二種方式:for迴圈

 print?

  1. public class Demo2 {  
  2.     public static void main(String[] args) {  
  3.         ArrayList list = new ArrayList();  
  4.         // 增加:add() 將指定物件儲存到容器中  
  5.         list.add("計算機網路");  
  6.         list.add("現代作業系統");  
  7.         list.add("java程式設計思想");  
  8.         list.add("java核心技術");  
  9.         list.add("java語言程式設計");  
  10.         System.out.println(list);  
  11.         for (Iterator it = list.iterator(); it.hasNext();) {  
  12.              //迭代器的next方法返回值型別是Object,所以要記得型別轉換。  
  13.             String next = (String) it.next();  
  14.             System.out.println(next);  
  15.         }  
  16.     }  
  17. }  

需要取出所有元素時,可以通過迴圈,java 建議使用for 迴圈。因為可以對記憶體進行一下優化。

第三種方式:使用迭代器清空集合

 print?

  1. public class Demo1 {  
  2.     public static void main(String[] args) {  
  3.         Collection coll = new ArrayList();  
  4.         coll.add("aaa");  
  5.         coll.add("bbb");  
  6.         coll.add("ccc");  
  7.         coll.add("ddd");  
  8.         System.out.println(coll);  
  9.         Iterator it = coll.iterator();  
  10.         while (it.hasNext()) {  
  11.             it.next();  
  12.             it.remove();  
  13.         }  
  14.         System.out.println(coll);  
  15.     }  
  16. }  

容器:Java中有的容器有List, Queue, Map, 下面對List 的介紹:List介面在Collection 的基礎上進行新增大量的方法,使得list的中間可以插入和移除元素,型別如下:1ArrayList,它是隨機訪問元素,在中間刪除,插入元素時較慢。

2LinkedList, 中間刪除,插入元素時較快。訪問較慢,

1.在這些集合中可以用contains()方法確定某個物件是否存在,

移除物件用remove(引用)還可以用物件的引用來使用indexOf(),發現物件中的索引位置,

  • add(E e) 將指定的元素追加到此列表的末尾。
  • (int index) 刪除該列表中指定位置的元素 
  • set(int index, E element) 用指定的元素替換此列表中指定位置的元素。
  • () 以正確的順序(從第一個到最後一個元素)返回一個包含此列表中所有元素的陣列。
  • get(int index) 返回此列表中指定位置的元素。
  • () 以正確的順序返回該列表中的元素的迭代器。

迭代器:

遍歷並選擇序列的物件,不必知道底層結構,Iterator只能單向移動,只可以用以下的方式:1使用方法Iterator()要求容器返回一個Iterator,Iterator 將準備好返回序列的第一個元素2使用next()獲得序列中的下一個元素3使用hasnext()檢查序列中是否有元素4使用remove()將迭代器新序列返回的元素刪除。() 從底層集合中刪除此迭代器返回的最後一個元素;此方法只能呼叫一次 。 如果底層集合在迭代過程中以任何方式進行修改而不是通過呼叫此方法,則迭代器的行為是未指定的。 實現要求: 預設的實現丟擲的一個例項並執行其他操作。

例如:

//遍歷方式一

List<Pet> pets=Pets.arrayList(12);

Iterator<Pet> it=pets.iterator();

while(it.hasNext()){

Pet p=it.next();

sysout(p.id());

}

//遍歷方式二

for(Pet p:pets){

sysout(p.id());

}

//遍歷方式三

Iterator<Pet> it=pets.iterator();

for(int i=0;i<6;i++){

it.next();

it.remove();

}

其實在迭代器在平時的用法還真的挺多的,多加以實踐和練習;