之后是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接口