いくつかのベンチマークを実行しています。私のテストの 1 つは順序に依存するため、そのために TreeSet を使用しています。私の 2 番目のテストはそうではないので、HashSet を使用しています。
TreeSet の挿入が遅いことはわかっています。しかし、すべての要素を反復処理する場合はどうでしょうか?
TreeSets内部ではTreeMapswhich はRed Black Trees(特殊なタイプのBST) を使用します。
BSTインオーダートラバーサルはO(n)
HashSetsEntry オブジェクトを保持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が得られますが、対数時間が得られると思います。