例如,我有一個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
基于原始代碼的代碼相比,這兩種方法都具有相當大的清晰度優勢。
添加回答
舉報
0/150
提交
取消