以下のコードでは、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 を使用する 2 番目の手法は、実行速度が速く、GC のオーバーヘッドが少ないということです。渡される Set の実装がわからない場合 (HashSet または LinkedHashSet が最も可能性が高いと仮定)、 toArray() または iterator() メソッドのそれぞれでどのくらいのオーバーヘッドが発生しますか? これに関する洞察は大歓迎です。
質問 (上からの繰り返し):
- toArray() と iterator() のどちらの手法が、GC (ガベージ コレクション) への影響が最も少なく、最も高速に実行される可能性が最も高いでしょうか?
- 渡される Set の実装がわからない場合 (HashSet または LinkedHashSet が最も可能性が高いと仮定)、 toArray() および iterator() メソッドのそれぞれでどのくらいのオーバーヘッドが発生しますか?