亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java中傳統for循環與Iterator / foreach的性能

Java中傳統for循環與Iterator / foreach的性能

素胚勾勒不出你 2019-11-26 15:06:47
在遍歷ArrayList,HashMap和其他集合時比較傳統的for循環與Iterator是否有任何性能測試結果?或者只是為什么我應該在循環中使用Iterator,反之亦然?
查看完整描述

3 回答

?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

假設這是您的意思:


// 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

}

對于沒有隨機訪問權限的集合(例如TreeSet,HashMap,LinkedList),Iterator的速度更快。對于數組和ArrayList,性能差異應該可以忽略不計。


編輯:我相信微基準測試是邪惡的根源,就像早期的優化一樣。但是話又說回來,我覺得對這樣瑣碎的事情的含義有感覺是一件好事。因此,我進行了一個小測試:


分別遍歷LinkedList和ArrayList

帶有100,000個“隨機”字符串

總結它們的長度(只是為了避免編譯器優化整個循環)

使用所有3種循環樣式(迭代器,每種,用于帶計數器)

除LinkedList“帶有計數器”外,其他所有結果均相似。所有其他五個在不到20毫秒的時間內遍歷整個列表。使用list.get(i)上一個LinkedList 100,000次時間超過2分鐘(?。﹣硗瓿桑?萬倍)。哇!:)因此,最好使用迭代器(顯式或隱式地為每個迭代器使用),尤其是如果您不知道要處理的列表的類型和大小時。


查看完整回答
反對 回復 2019-11-26
?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

使用迭代器的第一個原因是顯而易見的正確性。如果您使用手動索引,那么如果仔細觀察,可能會發現非常無害的一一錯誤:您是從1開始還是從0開始?你完成了length - 1嗎?您使用<還是<=?如果使用迭代器,則很容易看到它確實在迭代整個數組?!罢f你做什么,說什么?!?/p>

第二個原因是對不同數據結構的統一訪問??梢酝ㄟ^索引有效地訪問數組,但是最好記住已訪問的最后一個元素來遍歷鏈接列表(否則,您將獲得“ 畫家萊姆尼爾 ”)。哈希圖甚至更加復雜。通過提供來自這些數據結構和其他數據結構的統一接口(例如,您也可以進行樹遍歷),您將再次獲得明顯的正確性。遍歷邏輯只需要實現一次,并且使用它的代碼可以簡潔地“說出它做什么,然后按照它說的去做”。


查看完整回答
反對 回復 2019-11-26
  • 3 回答
  • 0 關注
  • 818 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號