次のようなコードスニペットを見ました
Set<Record> instances = new HashSet<Record>();
ハッシュセットは特別な種類のセットなのかしら。それらの間に何か違いはありますか?
次のようなコードスニペットを見ました
Set<Record> instances = new HashSet<Record>();
ハッシュセットは特別な種類のセットなのかしら。それらの間に何か違いはありますか?
回答:
ASet
は、一般的な「値のセット」を表します。ATreeSet
は要素がソートされている(したがって順序付けられている)HashSet
セットであり、aは要素がソートまたは順序付けされていないセットです。
AHashSet
は通常、よりもはるかに高速ですTreeSet
。
ATreeSet
は通常、赤黒木として実装されます(http://en.wikipedia.org/wiki/Red-black_treeを参照-sun / oracleの実際の実装は検証していませんTreeSet
)が、はでインデックスを作成するためにHashSet
使用Object.hashCode()
します配列。赤黒木のO(log(n))
アクセス時間はHashSet
一定時間から最悪の場合(すべてのアイテムが同じhashCodeを持つ)までの範囲であり、線形検索時間を使用できますO(n)
。
質問には答えましたが、コードが同じコードで両方のタイプに言及している理由に対する答えは見ていません。
通常、この場合はSetであるインターフェースに対してコーディングする必要があります。どうして?常にインターフェイスを介してオブジェクトを参照する場合(新しいHashSet()を除く)、コードで一度しか言及していないため、後でオブジェクトの実装を変更する方がよい場合は、変更するのは簡単です。ベース(新しいHashSet()を実行した場所)。
セットは、重複する要素を含まないコレクションです。セットはインターフェースです。
HashSetはSet
、ハッシュテーブル(実際にはHashMap
インスタンス)に裏打ちされたインターフェイスを実装します。
以来HashSet
、Set
インターフェースの特定の実装の1つです。
Set
以下のクラスで実装されているため、Aは次のいずれかになります。
ConcurrentSkipListSet:に基づくスケーラブルな同時NavigableSet実装ConcurrentSkipListMap
。セットの要素は、Comparator
使用されるコンストラクターに応じて、自然な順序に従って、またはセットの作成時に提供される順序に従って並べ替えられます。
CopyOnWriteArraySet:すべての操作に内部CopyOnWriteArrayListを使用するセット。
EnumSet :列挙型で使用するための特殊なSet実装。列挙型セット内のすべての要素は、セットの作成時に明示的または暗黙的に指定された単一の列挙型から取得する必要があります。
TreeSet:TreeMapに基づくNavigableSetの実装。要素は、使用されるコンストラクターに応じて、自然な順序付けを使用して、またはセットの作成時に提供されるコンパレーターによって順序付けられます。
LinkedHashSet:予測可能な反復順序を使用したSetインターフェイスのashテーブルとリンクリストの実装。この実装は、すべてのエントリを介して実行される二重リンクリストを維持するという点でHashSetとは異なります。
しかし、サブクラス以降HashSet
にのみ可能ですLinkedHashSet
LinkedHashSet
HashSet
HashSetは、Setインターフェイスから派生したクラスです。Setの派生クラスとして、HashSetはSetのプロパティを取得します。重要で最も頻繁に使用されるSetの派生クラスは、HashSetとTreeSetです。