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

标签 java iterator set hashset

例如,我有一个 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 using Iterator#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/

相关文章:

java - 浏览时找不到文件

c++ - 沿任一方向遍历容器并删除元素

c# - "this"运算符(operator)不工作

java - 如何从 java.util.Set 中获取第一项?

PHP 生成器返回类型

javascript - 输入文本标签,输入后不能设置值

java - 如何在VSCode中解析 'import javafx cannot be resolved'?

java - 小程序 war 项目在 jar 中找不到小程序类

java - Kafka 0.9 - 如何通过 java api 创建主题

c++ - 对同一对象的两次 size() 调用返回不同的值