Разница между словарем и хэш-таблицей

Словарь против Hashtable

Словарь набирается (так что значения типа не нуждаются в боксах), Hashtable - нет (так как типы значений нуждаются в боксах). Hashtable имеет более хороший способ получения значения, чем словарь IMHО, потому что он всегда знает, что значение является объектом. Благодаря тому, что вы используете .NET 3.5, легко написать расширенный метод для словаря, чтобы получить похожее поведение.

Класс Hashtable - это особый тип класса словаря, который использует целочисленное значение (называемое хешем), чтобы помочь в хранении его ключей. Класс Hashtable использует хеш для ускорения поиска по определенному ключу в коллекции. Каждый объект в .NET является производным от класса. Этот класс поддерживает метод GetHash, который возвращает целое число, однозначно идентифицирующее объект. Класс Hashtable является очень эффективной коллекцией в целом. Единственная проблема с классом Hashtable заключается в том, что ему требуется немного накладных расходов, а для небольших собраний (менее десяти элементов) накладные расходы могут препятствовать выполнению.

Есть одна важная разница между HashTable и Dictionary. Если вы используете индексаторы для получения значения из HashTable, HashTable будет успешно возвращать ноль для несуществующего элемента, в то время как Словарь выдаст ошибку, если вы попытаетесь получить доступ к элементу с помощью индексатора, которого нет в Словаре..

HashTable - это базовый класс со слабой типизацией; абстрактный класс DictionaryBase строго типизирован и внутренне использует HashTable.

Странная вещь, замеченная в словаре, заключается в том, что при добавлении нескольких слов в словарь сохраняется порядок, в котором они добавляются. Таким образом, если вы примените ссылку на словарь, вы получите записи в том же порядке, в котором вы их вставили. Принимая во внимание, что это не так с обычным HashTable, когда вы добавляете те же записи в Hashtable, порядок не сохраняется. Если «Словарь основан на Hashtable», это правда, почему словарь поддерживает порядок, но HashTable не делает?

Что касается того, почему они ведут себя по-разному, это потому, что Общий словарь реализует хеш-таблицу, но не основан на System.Cоllectiоns.Hashtable. Реализация общего словаря основана на размещении пар ключ-значение из списка. Затем они индексируются с помощью хеш-таблиц для случайного доступа, но когда он возвращает перечислитель, он просто просматривает список в последовательном порядке, который будет порядком вставки в течение длительного времени, так как записи не используются повторно..