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