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()方法会产生多少开销?任何有关这方面的见解将不胜感激.
问题(从上面重复):
toSearch.iterator().next()将更快,更少内存密集,因为它不需要复制任何数据,而toArray将分配和复制集的内容到数组.这与实际实现无关:toArray将始终必须复制数据.