ホームページ  >  記事  >  类库下载  >  HashSet HashTable と TreeSet

HashSet HashTable と TreeSet

高洛峰
高洛峰オリジナル
2016-11-01 15:01:121726ブラウズ

HashSetClass

HashSetクラスは主に、2つの集合の交差、和集合、差分などの高パフォーマンスの集合演算を実行するように設計されています。セットには、繰り返し出現せず、属性の順序を持​​たない一連の要素が含まれます。

HashSetのいくつかの機能は次のとおりです:

1. HashSet内の値は繰り返すことができず、順序はありません。

2. HashSetの容量は必要に応じて自動的に追加されます。

コンストラクター:

HashSet() デフォルトの等価コンパレーターは、空の新しいインスタンスを作成します。

HashSet(IEnumerable collection) 指定されたコレクション内のデータをコレクションにコピーします

HashSet(IEqualityComparer Comparer) 指定された等価コンパレータを使用して空の新しいインスタンスを作成します

HashSet(IEnumerable collection,IEqualityComparer Comparer ) 指定されたコンパレータを使用してデータをインスタンス化し、指定されたコレクション内の要素をコレクションにコピーします。

HashSet は集合演算を行うように特別に設計されているため、HashSet が提供するメソッドの多くは集合演算に関連しています。

以下はその一般的なメソッドの一部の紹介です

メンバー型の説明

Add メソッドは指定された要素をsetに追加します

Clear メソッドはset内のすべての要素をクリアします

Contains メソッドは要素がHashSet

Exists メソッドは、HashSetに指定された条件に一致する要素が含まれているかどうかを決定します

ExceptWith メソッドは、指定されたコレクション内のすべての要素を現在のHashSetから削除します

IntersectWith メソッドは、このオブジェクトとセット内に存在する指定された要素

IsProperSubsetOf メソッドは、HashSet

オブジェクトが指定されたセットの真のサブセットであるかどうかを決定します

IsProperSupersetOf メソッドは、HashSet

オブジェクトが指定されたセットの真のスーパーセットであるかどうかを決定します

IsSunsetOf メソッドは、HashSet が存在するかどうかを決定します

オブジェクトは指定されたセットの子です Set

IsSupersetOf メソッドはHashSet

オブジェクトが指定されたセットのスーパーセットであるかどうかを決定します

Remove メソッドはHashSet

オブジェクトから指定された要素を削除します

RemoveWhere メソッドは指定された要素をHashSet

オブジェクトから削除します指定された述語で定義された条件に一致する HashSet コレクション

SetEquals のすべての要素 HashSet オブジェクトに指定されたコレクションと同じ要素が含まれているかどうかを判定するメソッド

SynmmetricExceptWith メソッドは、現在の HashSet オブジェクトを、 に存在する要素のみを含むように変更しますオブジェクトまたは指定されたセット

TrimExcess メソッドは HashSet になります オブジェクトの容量は、それに含まれる実際の要素数に設定され、最も近い特性と実装値に切り上げられます。

UnionWithメソッド 現在のHashSetオブジェクトを変更して、オブジェクト自体と指定されたコレクションに存在するすべての要素を含めます

TreeSet

TreeSetはTreeMapに依存して実装されます。
TreeSet は順序付きセットです。TreeSet 内の要素は昇順に配置されます。これは、TreeSet 内の要素が Comparable インターフェイスを実装する必要があることを意味します。またはカスタムのコンパレータを使用します。
TreeSet オブジェクトを構築するときに、Comparator インターフェイスを実装するコンパレータ オブジェクトを渡すことができます。

TreeSetとHashSetの違い

1. HashSetはHashMapを通じて実装され、TreeSetはTreeMapを通じて実装されますが、SetはMapのキーのみを使用します

2 MapとSetのキーには共通点が1つあります。特徴は、セットの一意性です。

3. HashMap では、ソートの必要がないため、位置決めと一意性だけに注目する必要があります。 a. hashCode ハッシュ値を計算するために使用され、ハッシュ値はハッシュ テーブルのインデックスを決定するために使用されます。チェーン上の各項目を比較するため、オブジェクトはキー値に対応するエントリを実際に見つけることができます。ハッシュ テーブルにない場合は、リンクされたリストの前にエントリを追加します。見つかった場合は、Entry の値を置き換えて古い値を返します。

4. TreeMap はソートする必要があるため、もちろん、Comparator を使用して配置されます。 a. TreeMap の作成時にコンパレーターを指定できます

b. 作成時に決定されない場合は、 key.compareTo() メソッドが使用されます。これには、キーが Comparable インターフェイスを実装する必要があります。 Tree データ構造を使用して実装されているため、比較インターフェイスを使用して位置決めを完了できます。

HashTable

ハッシュテーブル(ハッシュテーブル)は、コンピューター分野では新しい概念ではありません。これらは、今日の基準からすると非常に遅いコンピューター処理を高速化するように設計されており、多くのデータ エントリをクエリするときに特定のエントリをすばやく見つけることができます。 最新のマシンは何千倍も高速ですが、ハッシュテーブルはアプリケーションから最高のパフォーマンスを引き出すための便利なツールです。

Hashtable オブジェクトと HashMap オブジェクトを使用すると、キーと値を組み合わせ、put() メソッドを使用してキーと値のペアをテーブルに入力できます。その後、 get() メソッドを呼び出し、キーをパラメーターとして渡すことで値を取得できます。キーと値は、2 つの基本要件を満たす限り、任意のオブジェクトにすることができます。キーと値はオブジェクトである必要があるため、プリミティブ型は Integer(int) などのメソッドを使用してオブジェクトに変換する必要があることに注意してください。

特定のクラスのオブジェクトをキーとして使用するには、このクラスは 2 つのメソッド、equals() と hashCode() を提供する必要があります。これら 2 つのメソッドは java.lang.Object にあるため、すべてのクラスがこれら 2 つのメソッドを継承できますが、Object クラスでのこれら 2 つのメソッドの実装は通常役に立たないため、通常はこれら 2 つのメソッドを自分でオーバーロードする必要があります。

Equals () メソッドは、そのオブジェクトと別のオブジェクトを比較し、2 つのオブジェクトが同じ情報を表す場合に true を返します。このメソッドは、両方のオブジェクトが同じクラスに属しているかどうかも確認します。 2 つの参照オブジェクトが同一のオブジェクトである場合、Object.equals() は true を返します。これが、このメソッドが一般に適切でない理由を説明しています。ほとんどの場合、フィールドごとに比較する方法が必要となるため、同じデータを表す異なるオブジェクトは等しいと見なされます。

HashCode() メソッドは、オブジェクトの内容を使用してハッシュ関数を実行することによって int 値を生成します。 Hashtable と HashMap は、この値を使用して、キーと値のペアがどのバケット (またはリスト) にあるかを判断します。ハッシュテーブルのパフォーマンス
ハッシュテーブルの効率に影響を与える主な要因はテーブル内のリストの平均長です。平均検索時間はこの平均長に直接関係しているためです。平均長を短くするには、ハッシュテーブル内のリストの数を増やす必要があるのは明らかです。リストの数が多すぎて、ほとんどまたはすべてのリストに 1 つのレコードしか含まれていない場合に、検索効率が最大になります。しかし、これは行き過ぎかもしれません。ハッシュテーブルにデータエントリよりもはるかに多くのリストが含まれている場合は、そのようなメモリコストを支払う必要はなく、場合によっては、人々がこのアプローチを受け入れることが不可能です。

ashtable と HashMap
Hashtable クラスと HashMap クラスには 3 つの重要な違いがあります。最初の違いは主に歴史的な理由によるものです。 Hashtable は古い Dictionary クラスに基づいており、HashMap は Java 1.2 で導入された Map インターフェイスの実装です。

おそらく最も重要な違いは、Hashtable のメソッドは同期的であるのに対し、HashMap のメソッドは同期的ではないことです。つまり、特別な操作を行わずにマルチスレッド アプリケーションでハッシュテーブルを使用できますが、ハッシュマップの外部同期も提供する必要があります。便利な方法は、Collections クラスの静的 synchronizedMap() メソッドを使用することです。このメソッドは、スレッドセーフな Map オブジェクトを作成し、それをカプセル化されたオブジェクトとして返します。このオブジェクトのメソッドを使用すると、基になる HashMap に同期的にアクセスできます。この結果、必要のないとき (シングル スレッド アプリケーションなど) にハッシュテーブルの同期を切断できなくなり、同期により多くの処理オーバーヘッドが追加されます。

3 番目の違いは、テーブル エントリのキーまたは値として null 値を使用できるのは HashMap だけであることです。 HashMap 内の空のキーにできるレコードは 1 つだけですが、任意の数のエントリを空の値にすることができます。これは、検索キーがテーブル内に見つからない場合、または検索キーが見つかってもそれが null 値である場合、get() は null を返すことを意味します。必要に応じて、containKey() メソッドを使用して、これら 2 つの状況を区別します。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。