为了账号安全,请及时绑定邮箱和手机立即绑定

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()在循环内使用是否更好(更快、更易读、更可取)?

没有理由认为该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 关注
  • 174 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信