例如,我有一个itertools.cycle
或更具体的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()
答案 0 :(得分:3)
在循环内使用
Set#clear()
而不是在循环内使用Iterator#remove()
更好(更快,更易读,更可取)吗?
没有理由认为clear()
方法比通过迭代器单独删除所有元素要慢。即使天真地实现了它,您也希望至少节省方法调用开销。实际上,clear()
有机会提高效率。
但是从性能角度来看可能为时过早。这不太可能成为代码中的瓶颈,因此使其更快不会产生明显的差异。但是除非您通过探查器测试性能,否则您将无法确定。
通常,最好首先关注功能,其次关注清晰度和简单性。考虑一些问题,例如如果您在遍历该集合的过程中中途退出该怎么办:是否删除了部分(但不是全部)元素,对吗?还是您需要任何东西的原始尺寸?等。只有在测量结果表明有改进潜力时,才进行性能优化。
如果从功能的角度来看,两种方法确实都同样好,那么让我观察到,使用clear()
的简化比从循环中删除Iterator.remove()
的调用还要好:您可以重写循环作为增强的for
循环或流管道。
该问题已经演示了增强的for
替代方案;这是流之一:
objects.stream()
.forEach(o -> System.out.println(String.valuef(o)));
objects.clear();
与原始的基于Iterator
的代码相比,这两种方法都具有明显的优势。