例如,我有一个 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();
最佳答案
Is it better (faster, more readable, more preferable) to use
Set#clear()
afterwards instead of usingIterator#remove()
inside the loop?
没有理由认为 clear()
方法会比通过迭代器单独删除所有元素慢。即使它是简单实现的,您也希望至少节省方法调用开销。在实践中,clear()
有机会提高效率。
但是从性能角度来看它可能还为时过早。这不太可能成为代码中的瓶颈,因此使其更快不太可能产生明显的差异。但除非您通过分析器测试性能,否则您无法确定。
通常最好首先关注功能,然后关注清晰度和简单性。考虑一些问题,例如如果在迭代集合的过程中中止会发生什么:删除某些(但不是全部)元素是否正确?或者您是否需要该套件的原始尺寸?等等。仅当测量显示有改进潜力时才执行性能优化。
如果从功能角度来看这两种方法确实同样好,那么请允许我观察使用clear()
比仅仅删除 Iterator.remove()
提供更好的简化从循环调用:您可以将循环重写为增强的 for
循环或流管道。
该问题已经演示了增强的for
选择;这是流之一:
objects.stream()
.forEach(o -> System.out.println(String.valuef(o)));
objects.clear();
与您原来的 Iterator
相比,这两者都具有相当大的清晰度优势。基于代码。
关于Java Set Iterator#remove() 还是 Set#clear() 之后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52211448/