Java Set Iterator#remove()或Set#clear()之后?

时间:2018-09-06 20:06:12

标签: java iterator set hashset

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

1 个答案:

答案 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的代码相比,这两种方法都具有明显的优势。