第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

Java中傳統(tǒng)for循環(huán)與Iterator / foreach的性能

Java中傳統(tǒng)for循環(huán)與Iterator / foreach的性能

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

3 回答

?
夢里花落0921

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萬倍)。哇!:)因此,最好使用迭代器(顯式或隱式地為每個迭代器使用),尤其是如果您不知道要處理的列表的類型和大小時。


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

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)一次,并且使用它的代碼可以簡潔地“說出它做什么,然后按照它說的去做”。


查看完整回答
反對 回復(fù) 2019-11-26
  • 3 回答
  • 0 關(guān)注
  • 798 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號