Java がandやnotSet
など、型のさまざまな実装を提供するのはなぜですか?HashSet
TreeSet
ArraySet
8 に答える
特定の順序ではない要素の配列のみに基づくセットは、常に含有チェックに O(n) 時間かかります。それほど役に立たないでしょう、IMO。orの代わりにそれを使いたいのはいつですか?HashSet
TreeSet
配列の最も有用な側面は、特定のインデックスを持つ要素に非常に迅速にアクセスできることです。セットに関しては、それはあまり関係ありません。
配列に裏打ちされたセットであるCopyOnWriteArraySetがあります。
これは、そのパフォーマンスが大規模なコレクションには適していないため、特に有用ではありません。
実際、Set の具体的な実装には意味がありません。どのセットも要素を格納し、その一意性を保証します。確かではありませんが、要素の順序を保持する Set 実装が必要なようです。私が正しければLinkedHashSet
.
JavaはCollection
、最高のパフォーマンスを可能にするインターフェースの複数の実装を提供します。多くの操作ArrayList
で優れたパフォーマンスを発揮します。List
Set
常に一意性を必要とするオペレーションの場合、さまざまな実装がより優れたパフォーマンスを提供します。配列を使用して実装された場合、変更操作はすべての配列要素を実行して、それがすべてセットに含まれているかどうかを確認する必要があります。HashSetとTreeSetは、このチェックを大幅に簡素化します。
このSet
インターフェイスには、 などのインデックスによる取得メソッドがないため、List.get(int)
Set が配列のようなプロパティを持つことができることを示唆しても意味がありません。
最終的に、すべての「グループ化」クラスは内部で配列を使用して要素を格納しますが、それは、配列にアクセスするためのメソッドを公開する必要があるという意味ではありません。
indexed-tree-mapを検討すると、インデックスで要素にアクセスし、ソート順を維持しながら要素のインデックスを取得できます。重複は、同じキーの下の値として配列に入れることができます。
あなたはいつでもそれを自分で実装することができます....おそらく、それが役立つ非常に非常に限られたケースが1つしかないことを認めます(そして、その場合、とにかくより良いデータ構造を使用できます)そしてそれはあなたが非常に大きなセットを持っている場所ですほとんど変更されない場合、配列セットが占有するメモリがわずかに少なくなり(余分なポインターはありません)、セット全体の列挙がわずかに高速になります...配列をソートしたままにしておくと、 O(lg n ) 検索時間。
ただし、これらの違いは純粋に学術的なものです。現実の世界では、あなたは本当にそのような獣を望んでいないでしょう.