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

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

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

Видео: Разница между словарем и хэш-таблицей
Видео: Хэш-таблицы за 10 минут 2024, Июль
Anonim

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

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

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

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

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

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

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

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