DictionaryまたはHashTableを使用するタイミングと理由を把握しようとしています。私はここで少し検索をしましたが、辞書の一般的な利点について話している人々を見つけました。これは、ボクシングとアンボックスの利点をわずかなパフォーマンス向上に導く完全に同意しています。
しかし、辞書は、オブジェクトが挿入された順序で常に返されるわけではなく、ソートされていることも読みました。 HashTableとしての場所。私が理解しているように、これにより、状況によってはHashTableがはるかに高速になります。
私の質問は本当に、これらの状況は何でしょうか?上記の私の仮定は間違っていますか?どちらを選択するのにどのような状況を使用できますか(はい、最後の状況は少しあいまいです)。
System.Collections.Generic.Dictionary<TKey, TValue>
クラスとSystem.Collections.Hashtable
クラスは両方とも、ハッシュテーブルデータ構造を内部的に維持します。 それらのどれもアイテムの順序を保持することを保証しません。
ボクシング/アンボクシングの問題は別として、ほとんどの場合、非常によく似たパフォーマンスが必要です。
それらの間の主な構造上の違いは、Dictionary
がchaining(各ハッシュテーブルバケットのアイテムのリストを維持する)に依存して衝突を解決するのに対し、Hashtable
はrehashing(衝突が発生した場合、別のハッシュ関数を使用してキーをバケットにマッピングします)。
.NET Framework 2.0以降をターゲットにしている場合は、Hashtable
クラスを使用してもほとんど利点はありません。 Dictionary<TKey, TValue>
によって効果的に廃止されます。
今では何の意味もありません。しかし、単に立ち止まる人々のための参考のために
パフォーマンステスト-SortedList vs.SortedDictionary vs.Dictionary vs.Hashtable
辞書:
ハッシュ表:
もう1つの重要な違いは、Hashtable型はロックフリーの複数のリーダーと単一のライターを同時にサポートしますが、Dictionaryはサポートしないことです。
MSDNの記事:「
Dictionary<TKey, TValue>
クラスの機能はHashtable
name__クラスと同じです。特定のタイプ(Object
name__以外)のDictionary<TKey, TValue>
は、Hashtable
name__の要素がHashtable
name__であるため、値型のObject
name__よりもパフォーマンスが優れています。値の型を保存または取得する場合、通常、ボックス化解除が発生します」。
リンク: http://msdn.Microsoft.com/en-us/library/4yh14awz(v = vs.90).aspx
両方とも事実上同じクラスです(逆アセンブリを見ることができます)。 HashTableは、.Netにジェネリックが含まれる前に最初に作成されました。ただし、辞書は汎用クラスであり、強力なタイピングの利点があります。辞書を使用するのに費用がかからないため、HashTableは使用しません。
もう1つの重要な違いは、Hashtable
がスレッドセーフであることです。 Hashtable
には、複数のリーダー/シングルライター(MR/SW)スレッドセーフが組み込まれています。つまり、Hashtable
は、ロックなしで複数のリーダーと1つのライターを許可します。 Dictionary
の場合、スレッドセーフはありません。スレッドセーフが必要な場合は、独自の同期を実装する必要があります。
さらに詳しく説明するには:
Hashtable
は、コレクションのスレッドセーフラッパーを返すSynchronizedプロパティを通じてスレッドセーフを提供します。ラッパーは、追加または削除操作ごとにコレクション全体をロックすることにより機能します。したがって、コレクションにアクセスしようとする各スレッドは、順番に1つのロックを取得するまで待機する必要があります。これはスケーラブルではなく、大規模なコレクションのパフォーマンスが大幅に低下する可能性があります。また、設計は競合状態から完全に保護されていません。
List<T>
、Dictionary<TKey, TValue>
などの.NET Framework 2.0コレクションクラスは、スレッドの同期を提供しません。アイテムが複数のスレッドで同時に追加または削除される場合、ユーザーコードはすべての同期を提供する必要があります。詳細はこちら。
オブジェクトが辞書に挿入された順序で常に返される読み取りを気にする場合は、
OrderedDictionary -整数のインデックスを介して値にアクセスできます(アイテムが追加された順序) SortedDictionary -アイテムは自動的にソートされます