在Java(1.5或更高版本)中,从Set中获取(任意)元素的最佳表现方式是什么?

cha*_*ium 8 java performance iterator set toarray

在下面的代码中,我需要从toSearch中获取元素,任何元素.我无法在Set接口定义中找到有用的方法来返回该集合的单个(随机,但不是必需的随机)成员.所以,我使用了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;
}
Run Code Online (Sandbox Code Playgroud)

我所讨论的另一种技术是用" toSearch.iterator().next() " 替换" (Coordinate)toSearch.toArray()[0] ".哪种技术toArray()或iterator()最有可能以最少的GC(垃圾收集)影响执行最快?

我的直觉(在编写这个问题之后)是使用迭代器的第二种技术将更快地执行并且降低GC的开销.鉴于我不知道传递的Set的实现(最可能假设HashSet或LinkedHashSet),每个toArray()或iterator()方法会产生多少开销?任何有关这方面的见解将不胜感激.

问题(从上面重复):

  1. 哪种技术toArray()或iterator()最有可能以最少的GC(垃圾收集)影响执行最快?
  2. 鉴于我不知道传递的Set的实现(最可能假设HashSet或LinkedHashSet),每个toArray()和iterator()方法会产生多少开销?

Cam*_*ner 9

toSearch.iterator().next()将更快,更少内存密集,因为它不需要复制任何数据,而toArray将分配和复制集的内容到数组.这与实际实现无关:toArray始终必须复制数据.