Hashtable コレクション型と Dictionary コレクション型

System.Collections.Hashtable クラス、および System.Collections.Generic.Dictionary<TKey,TValue>System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> ジェネリック クラスは、System.Collections.IDictionary インターフェイスを実装します。 Dictionary<TKey,TValue> ジェネリック クラスも IDictionary<TKey,TValue> ジェネリック インターフェイスを実装します。 そのため、これらのコレクション内の各要素は、キーと値のペアになります。

Hashtable オブジェクトは、コレクションの要素を含むバケットので構成されます。 バケットはHashtable に含まれる要素の仮想サブグループで、これを使用することにより、ほとんどのコレクションで検索と取得がより簡単で高速になります。 各バケットは、ハッシュ関数を使用して生成され、要素のキーに基づいている、ハッシュ コードに関連付けられています。

ジェネリック HashSet<T> クラスは、一意の要素を格納するための順序付けられていないコレクションです。

ハッシュ関数は、キーに基づく数値のハッシュ コードを返すアルゴリズムです。 キーは、格納されているオブジェクトのいくつかのプロパティの値です。 ハッシュ関数は、同じキーに対して常に同じハッシュ コードを返す必要があります。 ハッシュ関数によって 2 つの異なるキーを持つ同一のハッシュ コードを生成することも可能ですが、一意のキーごとに一意のハッシュ コードを生成するハッシュ関数のほうが、ハッシュ テーブルから要素を取得する際により優れたパフォーマンスを実現します。

Hashtable で要素として使用されている各オブジェクトは、GetHashCode メソッドの実装を使用して、それ自体のハッシュ コードを生成できる必要があります。 ただし、IHashCodeProvider 実装をパラメーターの 1 つとして受け入れる Hashtable コンストラクターを使用して、Hashtable のすべての要素のハッシュ関数を指定することもできます。

オブジェクトは、Hashtable に追加されるとき、そのオブジェクトのハッシュ コードと一致するハッシュ コードに関連付けられたバケットに格納されます。 値が Hashtable 内で検索されるとき、その値のハッシュ コードが生成されて、そのハッシュ コードに関連付けられたバケットが検索されます。

たとえば、文字列のハッシュ関数は、文字列内の各文字の ASCII コードを取得し、それらを加え合わせて 1 つのハッシュ コードを生成することができます。 その場合、文字列「picnic」のハッシュ コードは文字列「basket」のハッシュ コードと異なるので、文字列「picnic」と「basket」は異なるバケットに格納されます。 それに対して、「stressed」と「desserts」は同じハッシュ コードを持つので、同じバケットに格納されます。

Dictionary<TKey,TValue> および ConcurrentDictionary<TKey,TValue> クラスには、Hashtable クラスと同じ機能があります。 特定の型 (Object を除く) のDictionary<TKey,TValue> は、値型の Hashtable よりも優れたパフォーマンスを実現します。 これは、Hashtable の要素の型が Object であるため、値型を格納したり取得したりすると、ボックス化とボックス化解除が通常発生するためです。 複数のスレッドが同時にコレクションにアクセスするときには、ConcurrentDictionary<TKey,TValue> クラスを使用する必要があります。

関連項目