いくつかのベンチマークを実行しています。私のテストの 1 つは順序に依存するため、そのために TreeSet を使用しています。私の 2 番目のテストはそうではないので、HashSet を使用しています。
TreeSet の挿入が遅いことはわかっています。しかし、すべての要素を反復処理する場合はどうでしょうか?
TreeSets
内部ではTreeMaps
which はRed Black Trees
(特殊なタイプのBST
) を使用します。
BST
インオーダートラバーサルはO(n)
HashSets
Entry オブジェクトを保持HashMaps
するための を内部的に使用します。array
ここでもトラバーサルはO(n)
.
ベンチマークを作成しない限り、どちらが速いかを証明するのは困難です。
同様の投稿から(Hashset vs Treeset):
HashSet は TreeSet よりもはるかに高速ですが (add、remove、contains などのほとんどの操作で一定時間対ログ時間)、TreeSet のような順序保証はありません。
first()
、last()
、headSet()
などの順序付きセットを処理するためのいくつかの便利なメソッドを提供しtailSet()
ますHashSet
はある意味でとの中間TreeSet
です。リンクされたリストが実行されるハッシュテーブルとして実装されますが、 TreeSet によって保証されるソートされたトラバーサルとは異なる挿入順序の反復を提供します。したがって、使用方法の選択は完全にニーズに依存しますが、順序付けられたコレクションが必要な場合でも、HashSet を使用して Set を作成し、それを TreeSet に変換することをお勧めします。
Set<String> s = new TreeSet<String>(hashSet);
(ほぼ) a のパフォーマンスで安定した順序付けが必要な場合は、 aHashSet
を使用しLinkedHashSet
ます。それでも一定時間の操作TreeSet
が得られますが、対数時間が得られると思います。