HashSetとSetの違いは何ですか?


回答:


101

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)


さらに、次の汎用実装があります。LinkedHashSet(Iteratorの順序を保持するHashSetのバリアント)、ConcurrentSkipListSet(threadsave SortedSet実装)、CopyOnWriteArraySet(「大量の読み取り、めったにない」用に最適化されたスレッドセーフなバリアント書き込み ")、EnumSet(要素の列挙型でのみ機能しますが、HashSetよりもさらに高速です)。
–PaŭloEbermann 2011

7
@エリック:あなたの答えを編集してください。TreeSetは、順序付けされずに並べ替えられます。HashSet =順序なし、TreeSet =並べ替え、LinkedHashSet =順序付き。それに応じてあなたの答えを修正してください
Rais Alam 2013年

hashCodeの実装が悪い場合(たとえば、常に同じハッシュコードを返す場合)、ハッシュセットが遅くなる可能性があります
Romain Hautefeuille 2017年

35

HashSetの実装ですSet


14
このコメントがわかりません。問題は「違いは何か」であり、「間の関係は何か」ではありません。
jambox 2016

8
彼は違いを説明しました。Setはインターフェースであり、HashSetはそのインターフェースの実装です。したがって、これらは異なる実装ではなく、単にHashSetがSetの実装の1つです(他の実装はTreeSetです)。
AggieDev 2016

私には有効な答えのように聞こえます
Romain Hautefeuille 2017年

3
あなたは質問にまったく答えなかったので、あなたに反対票を残しました。将来的には、いくつかのドキュメント、例、および比較を追加することをお勧めします。1つの文を書くだけで、ほとんどのコンテンツは他の場所へのリンクにすぎず、StackOverflowで質問に答える方法ではありません
ウルダ2017

この質問は6年前に回答されました(上記を参照)が、ありがとうございます。
vaugham

16

質問には答えましたが、コードが同じコードで両方のタイプに言及している理由に対する答えは見ていません。

通常、この場合はSetであるインターフェースに対してコーディングする必要があります。どうして?常にインターフェイスを介してオブジェクトを参照する場合(新しいHashSet()を除く)、コードで一度しか言及していないため、後でオブジェクトの実装を変更する方がよい場合は、変更するのは簡単です。ベース(新しいHashSet()を実行した場所)。


14

セットは、重複する要素を含まないコレクションです。セットはインターフェースです。

HashSetSet、ハッシュテーブル(実際にはHashMapインスタンス)に裏打ちされたインターフェイスを実装します。

以来HashSetSetインターフェースの特定の実装の1つです。

Set以下のクラスで実装されているため、Aは次のいずれかになります。

ConcurrentSkipListSet:に基づくスケーラブルな同時NavigableSet実装ConcurrentSkipListMap。セットの要素は、Comparator使用されるコンストラクターに応じて、自然な順序に従って、またはセットの作成時に提供される順序に従って並べ替えられます。

CopyOnWriteArraySet:すべての操作に内部CopyOnWriteArrayListを使用するセット。

EnumSet :列挙型で使用するための特殊なSet実装。列挙型セット内のすべての要素は、セットの作成時に明示的または暗黙的に指定された単一の列挙型から取得する必要があります。

TreeSet:TreeMapに基づくNavigableSetの実装。要素は、使用されるコンストラクターに応じて、自然な順序付けを使用して、またはセットの作成時に提供されるコンパレーターによって順序付けられます。

LinkedHashSet:予測可能な反復順序を使用したSetインターフェイスのashテーブルとリンクリストの実装。この実装は、すべてのエントリを介して実行される二重リンクリストを維持するという点でHashSetとは異なります。

しかし、サブクラス以降HashSetにのみ可能ですLinkedHashSetLinkedHashSetHashSet


8

Setは、セットのようなコレクションへの一般的なインターフェイスですが、HashSetは、Setインターフェイスの特定の実装です(ハッシュコードを使用するため、名前が付けられています)。


2

Setは、TreeSet、LinkedHashSetなどのすべてのセットクラスの親インターフェイスです。

HashSetは、Setインターフェイスを実装するクラスです。


0

HashSetは、Setインターフェイスから派生したクラスです。Setの派生クラスとして、HashSetはSetのプロパティを取得します。重要で最も頻繁に使用されるSetの派生クラスは、HashSetとTreeSetです。


-1

****

  • セットする:

**これは、LISTやQUEUEと同様に、Collectionインターフェイスのサブタイプであるインターフェイスです。

セットには3つ以下のサブクラスがあり、重複することなく複数のオブジェクトを格納するために使用されます。

  1. HashSet
  2. LinkedHashSet
  3. TreeSet(SortedSetインターフェースを実装)

****

  • HashSet:

****

1つのNULL値を使用できます(複製は許可されていないため)。データはシーケンスを維持しないため、ランダムに格納されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.