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

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

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

Видео: Разница между словарем и хеш-таблицей
Видео: Гарвард. CS50 на русском. 1. Короткие видео. 1. Хэш таблицы 2024, Ноябрь
Anonim

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

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

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

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

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

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

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

Рекомендуем: