3 回答

TA貢獻1772條經(jīng)驗 獲得超6個贊
假設(shè)這是您的意思:
// traditional for loop
for (int i = 0; i < collection.size(); i++) {
T obj = collection.get(i);
// snip
}
// using iterator
Iterator<T> iter = collection.iterator();
while (iter.hasNext()) {
T obj = iter.next();
// snip
}
// using iterator internally (confirm it yourself using javap -c)
for (T obj : collection) {
// snip
}
對于沒有隨機訪問權(quán)限的集合(例如TreeSet,HashMap,LinkedList),Iterator的速度更快。對于數(shù)組和ArrayList,性能差異應(yīng)該可以忽略不計。
編輯:我相信微基準測試是邪惡的根源,就像早期的優(yōu)化一樣。但是話又說回來,我覺得對這樣瑣碎的事情的含義有感覺是一件好事。因此,我進行了一個小測試:
分別遍歷LinkedList和ArrayList
帶有100,000個“隨機”字符串
總結(jié)它們的長度(只是為了避免編譯器優(yōu)化整個循環(huán))
使用所有3種循環(huán)樣式(迭代器,每種,用于帶計數(shù)器)
除LinkedList“帶有計數(shù)器”外,其他所有結(jié)果均相似。所有其他五個在不到20毫秒的時間內(nèi)遍歷整個列表。使用list.get(i)上一個LinkedList 100,000次時間超過2分鐘(!)來完成(慢6萬倍)。哇!:)因此,最好使用迭代器(顯式或隱式地為每個迭代器使用),尤其是如果您不知道要處理的列表的類型和大小時。

TA貢獻1799條經(jīng)驗 獲得超8個贊
使用迭代器的第一個原因是顯而易見的正確性。如果您使用手動索引,那么如果仔細觀察,可能會發(fā)現(xiàn)非常無害的一一錯誤:您是從1開始還是從0開始?你完成了length - 1
嗎?您使用<
還是<=
?如果使用迭代器,則很容易看到它確實在迭代整個數(shù)組?!罢f你做什么,說什么?!?/p>
第二個原因是對不同數(shù)據(jù)結(jié)構(gòu)的統(tǒng)一訪問??梢酝ㄟ^索引有效地訪問數(shù)組,但是最好記住已訪問的最后一個元素來遍歷鏈接列表(否則,您將獲得“ 畫家萊姆尼爾 ”)。哈希圖甚至更加復(fù)雜。通過提供來自這些數(shù)據(jù)結(jié)構(gòu)和其他數(shù)據(jù)結(jié)構(gòu)的統(tǒng)一接口(例如,您也可以進行樹遍歷),您將再次獲得明顯的正確性。遍歷邏輯只需要實現(xiàn)一次,并且使用它的代碼可以簡潔地“說出它做什么,然后按照它說的去做”。
添加回答
舉報