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
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
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 是基於索引(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