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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了之后是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();
答案

之后使用Set#clear()而不是在循环中使用Iterator#remove()更好(更快,更可读,更可取)?

没有理由认为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()?的主要内容,如果未能解决你的问题,请参考以下文章

java iterator循环遍历集合(比如HashSet)的原理

Java的Iterator迭代器补充,增强for循环,泛型,List接口,set接口

list set map概要

怎样从java集合类set中取出数据?

集合 Collection List Set 迭代器 Iterator 元素排序

怎样从java集合类set中取出数据