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(Garbage Collection)影响最小?
我的直觉(在撰写本问题后)是使用迭代器的第二种技术在执行速度和GC开销方面都更快。鉴于我不知道传递的Set的实现(假设为HashSet或LinkedHashSet最有可能),在toArray()方法和iterator()方法中分别会产生多少开销?任何相关见解都将不胜感激。
问题(从上面重复):
1.使用toArray()还是iterator(),哪个技术最可能以最快的速度执行并对GC(Garbage Collection)影响最小? 2.鉴于我不知道传递的Set的实现(假设为HashSet或LinkedHashSet最有可能),在toArray()方法和iterator()方法中分别会产生多少开销?
ArrayList
可能不会 - 它可以使用System.arrayCopy
进行快速复制。无论如何,如果可以避免复制数据,就不要复制。 - Cameron SkinnerQueue
替换Set
来避免这个问题。你可以使用一个Set
来保存已访问的节点以避免循环,并使用一个Queue
来保存打开的节点集合。 - Cameron Skinner