在下面的代码中,我需要从toSearch中获取一个元素,任何元素。我无法在Set接口(interface)定义上找到有用的方法来仅返回集合的单个(随机,但不一定是随机的)成员。因此,我使用了 toArray()[0] 技术(在下面的代码中提供)。

private Set<Coordinate> floodFill(Value value, Coordinate coordinateStart)
{
    Set<Coordinate> result = new LinkedHashSet<Coordinate>();

    Set<Coordinate> toSearch = new LinkedHashSet<Coordinate>();
    toSearch.add(coordinateStart);
    while (toSearch.size() > 0)
    {
        Coordinate coordinate = (Coordinate)toSearch.toArray()[0];
        result.add(coordinate);
        toSearch.remove(coordinate);
        for (Coordinate coordinateAdjacent: getAdjacentCoordinates(coordinate))
        {
            if (this.query.getCoordinateValue(coordinateAdjacent) == value)
            {
                if (!result.contains(coordinateAdjacent))
                {
                    toSearch.add(coordinateAdjacent);
                }
            }
        }
    }

    return result;
}

我看到的讨论的另一种技术是将“(Coordinate)toSearch.toArray()[0] ”替换为“ toSearch.iterator()。next()”。哪种技术,toArray()或iterator(),最有可能在GC(垃圾回收)影响最小的情况下最快地执行?

我的直觉(在解决了这个问题之后)是,使用Iterator的第二种技术既可以更快地执行,又可以降低GC的开销。鉴于我不知道所传递的Set的实现(假设最有可能是HashSet或LinkedHashSet),每个toArray()或iterator()方法会产生多少开销?任何对此的见解将不胜感激。

问题(从上方重复):

  • 哪种技术,toArray()或iterator(),最有可能以最快的速度执行,并且对GC(垃圾收集)的影响最小?
  • 给定我不知道所传递的Set的实现(假设HashSet或LinkedHashSet最有可能),每个toArray()和iterator()方法会产生多少开销?
  • 最佳答案

    toSearch.iterator().next()不需要复制任何数据,因此速度更快,占用的内存更少,而toArray将分配集合的内容并将其复制到数组中。这与实际的实现方式无关:toArray将始终必须复制数据。

    关于java - 在Java(1.5或更高版本)中,从Set中获取(任何)元素的最佳性能方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4356517/

    10-10 12:45