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

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

Java Set Iterator#remove() 還是 Set#clear() 之后?

Java Set Iterator#remove() 還是 Set#clear() 之后?

繁花不似錦 2021-09-03 15:13:13
例如,我有一個Set<Object> objects或更具體的objects = new HashSet<>().現在我想遍歷集合,為每個元素調用一些東西,然后從集合中刪除元素。Iterator<Object> iterator = objects.iterator();while (iterator.hasNext()) {    Object object = iterator.next();    System.out.println(String.valueOf(object));    iterator.remove();}Set#clear()事后使用而不是Iterator#remove()在循環內使用是否更好(更快、更易讀、更可?。??for (Object object : objects) {    System.out.println(String.valueOf(object));}objects.clear();
查看完整描述

1 回答

?
吃雞游戲

TA貢獻1829條經驗 獲得超7個贊

Set#clear()事后使用而不是Iterator#remove()在循環內使用是否更好(更快、更易讀、更可?。?/p>

沒有理由認為該clear()方法會比通過迭代器單獨刪除所有元素慢。即使它是天真的實現,您也希望至少節省方法調用開銷。在實踐中,clear()有機會提高效率。

但是從性能的角度來看它可能還為時過早。這不太可能成為您代碼中的瓶頸,因此使其更快不太可能產生明顯的差異。但是除非您通過分析器測試性能,否則您無法確定。

通常最好首先關注功能,其次關注清晰度和簡單性。考慮一些問題,例如如果您在迭代集合的過程中中止會發生什么:然后刪除某些元素(但不是全部)是否正確?或者你需要任何東西的原始尺寸?等。僅在測量結果表明有改進潛力的時間和地點執行性能優化。

如果從功能的角度來看這兩種方法確實同樣好,那么請允許我觀察到,使用clear()提供了比僅從Iterator.remove()循環中刪除調用更好的簡化:您可以將循環重寫為增強for循環或流管道。

這個問題已經展示了增強的for替代方案;這是流之一:

objects.stream()
       .forEach(o -> System.out.println(String.valuef(o)));
       objects.clear();

Iterator基于原始代碼的代碼相比,這兩種方法都具有相當大的清晰度優勢。


查看完整回答
反對 回復 2021-09-03
  • 1 回答
  • 0 關注
  • 197 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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