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

例如,我有一个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();


繁花不似锦
浏览 175回答 1
1回答

吃鸡游戏

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

相关分类

Java