1.在形式上
for的形式是
for(int i=0;i<arr.size();i++){...}
foreach的形式是
for(int i:arr){...}
iterator的形式是
Iterator it = arr.iterator();
while(it.hasNext()){ object o =it.next(); ...}
2.條件上
- for需要知道集合或數(shù)組的大小淫奔,而且需要是有序的,不然無法遍歷超埋;
- foreach和iterator都不需要知道集合或數(shù)組的大小,他們都是得到集合內(nèi)的每個(gè)元素然后進(jìn)行處理佳鳖;
3.多態(tài)差別
for和foreach都需要先知道集合的類型霍殴,甚至是集合內(nèi)元素的類型,即需要訪問內(nèi)部的成員系吩,不能實(shí)現(xiàn)態(tài)来庭;
iterator是一個(gè)接口類型,他不關(guān)心集合或者數(shù)組的類型穿挨,而且他還能隨時(shí)修改和刪除集合的元素月弛,舉個(gè)例子:
public void display(Iterator<object> it){
while(it.hasNext()){
system.out.print(it.next()+"");
}
}
當(dāng)我們需要遍歷不同的集合時(shí),我們只需要傳遞集合的iterator(如arr.iterator())看懂了吧科盛,這就是iterator的好處帽衙,他不包含任何有關(guān)他所遍歷的序列的類型信息,能夠?qū)⒈闅v序列的操作與序列底層的結(jié)構(gòu)分離贞绵。迭代器統(tǒng)一了對容器的訪問方式厉萝。這也是接口的解耦的最好體現(xiàn)。
3.用法差別
- for循環(huán)一般用來處理比較簡單的有序的,可預(yù)知大小的集合或數(shù)組
- foreach可用于遍歷任何集合或數(shù)組谴垫,而且操作簡單易懂章母,他唯一的不好就是需要了解集合內(nèi)部類型
- iterator是最強(qiáng)大的,他可以隨時(shí)修改或者刪除集合內(nèi)部的元素翩剪,并且是在不需要知道元素和集合的類 型的情況下進(jìn)行的(原因可參考第三點(diǎn):多態(tài)差別)乳怎,當(dāng)你需要對不同的容器實(shí)現(xiàn)同樣的遍歷方式時(shí),迭代器是最好的選擇前弯!
5.效率差別
同樣遍歷一個(gè)集合蚪缀,iterator和foreach用時(shí)不相上下。for循環(huán)用時(shí)最少博杖。