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

更新 : 2007 年 11 月

Hashtable クラスと Dictionary<TKey, TValue> ジェネリック クラスは、IDictionary インターフェイスを実装します。Dictionary<TKey, TValue> ジェネリック クラスは、IDictionary<TKey, TValue> ジェネリック インターフェイスも実装します。したがって、これらのコレクションの各要素はキーと値の組み合わせです。

Hashtable オブジェクトは、コレクションの要素を格納するバケットで構成されます。バケットは、Hashtable 内の要素の仮想サブグループであり、これによって、ほとんどのコレクションよりも簡単および高速に検索と取得を実行できます。各バケットは、ハッシュ関数を使用して生成された、要素のキーに基づくハッシュ コードに関連付けられます。

ハッシュ関数は、キーに基づく数値のハッシュ コードを返すアルゴリズムです。キーは、コレクションに格納されるオブジェクトのプロパティの値です。ハッシュ関数は、常に同じキーに対して同じハッシュ コードを返す必要があります。ハッシュ関数は 2 つの異なるキーに対して同じハッシュ コードを返すこともできますが、一意の各キーに対して一意のハッシュ コードを生成するハッシュ関数を使用する方が、ハッシュ テーブルから要素を取得するときのパフォーマンスが向上します。

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

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

たとえば、文字列用のハッシュ関数は、文字列内の各文字の ASCII コードを取り出し、それらを組み合わせてハッシュ コードを生成します。文字列 "picnic" には、文字列 "basket" のハッシュ コードとは異なるハッシュ コードが生成されます。このため、"picnic" と "basket" の各文字列は、異なるバケットに格納されます。一方、"stressed" と "desserts" には同じハッシュ コードが生成され、どちらも同じバケットに格納されます。

Dictionary<TKey, TValue> クラスと Hashtable クラスの機能は同じです。Object 以外の特定の型を持つ Dictionary<TKey, TValue> は、パフォーマンスの点で値型の Hashtable より優れています。これは、Hashtable の要素は Object 型であり、したがって、値型を格納または取得する場合に通常はボックス化やボックス化解除が行われるためです。

参照

参照

Hashtable

IDictionary

IHashCodeProvider

Dictionary<TKey, TValue>

System.Collections.Generic.IDictionary<TKey, TValue>

その他の技術情報

一般的に使用されるコレクション型