在下面的代码中,我需要从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()方法会产生多少开销?任何对此的见解将不胜感激。
问题(从上方重复):
最佳答案
toSearch.iterator().next()
不需要复制任何数据,因此速度更快,占用的内存更少,而toArray
将分配集合的内容并将其复制到数组中。这与实际的实现方式无关:toArray
将始终必须复制数据。
关于java - 在Java(1.5或更高版本)中,从Set中获取(任何)元素的最佳性能方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4356517/