代码之家  ›  专栏  ›  技术社区  ›  stonar96

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

  •  0
  • stonar96  · 技术社区  · 7 年前

    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();
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   John Bollinger    7 年前

    使用它是否更好(更快、更可读、更可取) Set#clear() 之后而不是使用 Iterator#remove()

    没有理由认为 clear() 方法将比通过迭代器逐个删除所有元素慢。即使它是天真地实现的,您也希望至少可以节省方法调用开销。实际上,

    但是,从性能的角度来看它可能还为时过早。这不太可能成为代码中的瓶颈,因此加快代码速度不太可能产生明显的差异。但除非通过探查器测试性能,否则您无法确定。

    通常,最好首先关注功能,其次关注清晰性和简单性。考虑这样的问题:如果在迭代集合的过程中中止,会发生什么:删除某些元素(而不是全部)是正确的吗?或者你需要电视机的原始尺寸吗?等。只有当测量结果显示有改进的潜力时才执行性能优化。

    清除() 提供了比删除 Iterator.remove() 从循环调用:可以将循环重写为增强的 for 循环或流管道。

    对于 另一种选择,这里有一个:

    objects.stream()
           .forEach(o -> System.out.println(String.valuef(o)));
    objects.clear();
    

    Iterator -基于代码。