1. 程式人生 > >Java基礎複習筆記--Iterator和增強for的比較

Java基礎複習筆記--Iterator和增強for的比較

Iterator是Java中的一個迭代器介面(Interface),用來提供標準的Java迭代器
Iterator支援泛型因為集合(Collection)類可以裝入的型別是不確定的,從集合中取出的都是Object型別,加入泛型,就是告訴編譯器確定要裝入的物件型別,取值時就無需強制轉換了。

for each 是 Java 5 中新增的一個迴圈結構,本質上是一個Iterator,特點是可以用來遍歷集合元素而不用考慮集合下標。

綜合例項:

package net.csdn.fortest;

import java.util.ArrayList;
import java.util.Iterator;
import

java.util.List;

public class IteratorDemo {
/**

  • Iterator和for each的綜合例子
    @param args
    /
    public static void main(String[] args) {
    //建立一個list並設定泛型為Emp型別
    List<Emp> list = new ArrayList<Emp>();
    //新增Emp例項到list
    list.add(new Emp(“one”));
    list.add(new Emp("
    "));
    list.add(new Emp(“two”));
    list.add(new
    Emp("
    "));
    list.add(new Emp(“three”));
    list.add(new Emp(""));
    //使用list的iterator()方法返回一個迭代器
    Iterator<Emp> it = list.iterator();
    //hasNext() Iterator中的一個方法,判斷是否有下一個元素
    while(it.hasNext()) {
    //如果Emp物件中的name的值是則刪除該元素
    if("*".equals(it.next().getName())){
    it.remove();
    }
    }
    System.out.println(list);
    //增強for迴圈用於遍歷集合,但不適合對集合進行刪除操作

    //但是可以進行修改
    for(Emp e : list) {
    list.set(1,new Emp(“1”));
    System.out.print(e.getName()+" ");
    }
    }
    }
    /**
  • Emp類
    * @author haydn

*/
class Emp {
private String name;
public Emp(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return name;
}
}

執行結果:
[one, two, three]
one 1 three

Iterator和 for each的區別:
1.for each 不能刪除集合元素
2.Iterator 只能使用自身的remove()方法來刪除元素,不能用集合的刪除操作
3.ArrayList裡,for迴圈較快,LinkedList裡,使用iterator較快.

為什麼ArrayList的遍歷中for比Iterator快,而LinkedList中卻是Iterator遠快於for?這得從ArrayList和LinkedList兩者的資料結構說起了:
ArrayList 是基於索引(index)的陣列,索引在陣列中搜索和讀取資料的時間複雜度是O(1),但是要增加和刪除資料卻是開銷很大的,因為這需要重排陣列中的所有資料。
LinkedList 的底層實現則是一個雙向迴圈帶頭節點的連結串列,因此LinkedList中插入或刪除的時間複雜度僅為O(1),但是獲取資料的時間複雜度卻是O(n)。
明白了兩種List的區別之後,就知道,ArrayList用for迴圈隨機讀取的速度是很快的,因為ArrayList的下標是明確的,讀取一個數據的時間複雜度僅為O(1)。但LinkedList若是用for來遍歷效率很低,讀取一個數據的時間複雜度就達到了為O(n)。而用Iterator的next()則是順著連結串列節點順序讀取資料的效率就很高了。

總結:這兩種遍歷方式各有特色,優勢各有不同,在處理不同情景下的資料,利用好它們的長處能使程式執行的更好。

參考:https://blog.csdn.net/shf4715/article/details/47029049 https://blog.csdn.net/OrPis/article/details/80839303