在下面的代码中,我需要从 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;
}
我看到讨论的另一种技术是将“ (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() 方法会产生多少开销?