例如,我有一个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()
在循环内使用是否更好(更快、更易读、更可取)?
没有理由认为该clear()
方法会比通过迭代器单独删除所有元素慢。即使它是天真的实现,您也希望至少节省方法调用开销。在实践中,clear()
有机会提高效率。
但是从性能的角度来看它可能还为时过早。这不太可能成为您代码中的瓶颈,因此使其更快不太可能产生明显的差异。但是除非您通过分析器测试性能,否则您无法确定。
通常最好首先关注功能,其次关注清晰度和简单性。考虑一些问题,例如如果您在迭代集合的过程中中止会发生什么:然后删除某些元素(但不是全部)是否正确?或者你需要任何东西的原始尺寸?等。仅在测量结果表明有改进潜力的时间和地点执行性能优化。
如果从功能的角度来看这两种方法确实同样好,那么请允许我观察到,使用clear()
提供了比仅从Iterator.remove()
循环中删除调用更好的简化:您可以将循环重写为增强for
循环或流管道。
这个问题已经展示了增强的for
替代方案;这是流之一:
objects.stream() .forEach(o -> System.out.println(String.valuef(o))); objects.clear();
与Iterator
基于原始代码的代码相比,这两种方法都具有相当大的清晰度优势。
添加回答
举报
0/150
提交
取消