web-dev-qa-db-ja.com

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

次のようなコードスニペットを見ました

Set<Record> instances = new HashSet<Record>();

ハッシュセットが特別な種類のセットであるかどうか疑問に思っています。それらの違いは何ですか?

67
user496949

Setは、一般的な「値のセット」を表します。 TreeSetは要素が並べ替えられた(したがって順序付けられた)セットであり、HashSetは要素がnotソートまたは順序付け。

HashSetは通常、TreeSetよりもはるかに高速です。

TreeSetは通常、赤黒ツリーとして実装されます( http://en.wikipedia.org/wiki/Red-black_tree を参照してください-私は実際の実装を検証していませんSun/OracleのTreeSet)に対して、HashSetObject.hashCode()を使用して配列にインデックスを作成します。赤黒木のアクセス時間はO(log(n))であるのに対し、HashSetのアクセス時間は一定時間から最悪の場合(すべてのアイテムが同じhashCodeを持っている)の範囲であり、検索時間O(n)

81
Erik

HashSetSet の実装です。

30
vaugham

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

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

14
MeBigFatGuy

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

8
gmw

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

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

HashSetSetインターフェイスの特定の実装の1つであるためです。

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

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

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

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

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

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

ただし、HashSetは、LinkedHashSetサブクラスLinkedHashSetであるため、HashSetにしかできません。

3
Ravindra babu

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

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

2
u449355

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

0
Hemlata Gehlot

**

  • セットする:

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

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

  1. ハッシュセット
  2. LinkedHashSet
  3. TreeSet(SortedSetインターフェースを実装)

**

  • ハッシュセット:

**

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

0
Anonymous User