Я пытаюсь выяснить, когда и зачем использовать словарь или HashTable. Я провел здесь небольшой поиск и обнаружил, что люди говорят о типичных преимуществах Словаря, с которыми я полностью согласен, что приводит к преимуществам бокса и распаковки для небольшого прироста производительности.
Но я также читал, что Словарь не всегда возвращает объекты в том порядке, в котором они вставлены, вещь, которую он сортирует. Где как HashTable будет. Насколько я понимаю, это приводит к тому, что HashTable в некоторых ситуациях работает намного быстрее.
Мой вопрос действительно, что может быть в таких ситуациях? Я просто ошибаюсь в своих предположениях выше? Какие ситуации вы могли бы использовать, чтобы выбрать одно над другим (да, последнее немного неоднозначно).
Ответы:
System.Collections.Generic.Dictionary<TKey, TValue>
иSystem.Collections.Hashtable
классы поддерживают структуру данных хеш-таблицы внутри. Ни один из них не гарантирует сохранение порядка товаров.Если оставить в стороне проблемы с боксом / распаковкой, большую часть времени они должны иметь очень похожую производительность.
Основное структурное различие между ними является то , что
Dictionary
зависит от цепочки (сохранения списка элементов для каждого хеша - таблицу ведра) для разрешения коллизий в то время какHashtable
использования Rehashing для разрешения конфликтов (когда происходит столкновение, пытается другой хэш - функция для отображения ключа в ведро) ,Использование
Hashtable
класса малоэффективно, если вы ориентируетесь на .NET Framework 2.0+. Это фактически оказано устаревшимDictionary<TKey, TValue>
.источник
Hashtable
. В хеш-таблицах хранится 3 элемента информации: хеш-ключ, сам ключ и значение. Для элементов с одинаковым хешем придется пройти по списку, чтобы найти элемент с равным ключом и вернуть его значение. Это в значительной степени верно и дляHashtable
тоже. Как разработчик, использующийDictionary
обычно, вам не нужно беспокоиться об этом.Я думаю, это ничего не значит для вас сейчас. Но только для справки для людей, заходящих
Тест производительности - SortedList и SortedDictionary, словарь и Hashtable.
Выделение памяти:
Время, используемое для вставки:
Время поиска предмета:
источник
Различия между Hashtable и словарем
Словарь:
Хеш-таблица:
источник
Еще одно важное отличие состоит в том, что тип Hashtable поддерживает одновременную работу нескольких читателей и одного писателя, в то время как Dictionary - нет.
источник
Ссылка: http://msdn.microsoft.com/en-us/library/4yh14awz(v=vs.90).aspx
источник
Оба по сути одного класса (вы можете посмотреть на разборку). HashTable был создан первым до того, как в .Net появились дженерики. Словарь, однако, является общим классом и дает вам сильные преимущества при наборе текста. Я бы никогда не использовал HashTable, так как Словарь ничего не стоит.
источник
Другое важное отличие - это
Hashtable
потокобезопасность.Hashtable
имеет встроенную безопасность потоков для нескольких считывателей / писателей (MR / SW), что означает, чтоHashtable
позволяет ОДНОМ записывать вместе с несколькими считывателями без блокировки В случаеDictionary
отсутствия безопасности потоков, если вам нужна безопасность потоков, вы должны реализовать собственную синхронизацию.Чтобы уточнить дальше:
источник
Преимущество словарей состоит в том, что они являются универсальными, что делает их безопасными и немного более быстрыми из-за отсутствия необходимости в боксе. Следующая таблица сравнения (построенная с использованием ответов, найденных в аналогичном посте с вопросом о SO ) иллюстрирует некоторые другие причины, которые поддерживают словари для хеш-таблиц (или наоборот).
источник
Если вы заботитесь о чтении, которое всегда возвращает объекты в том порядке, в котором они вставлены в словарь, вы можете взглянуть на
OrderedDictionary - доступ к значениям осуществляется через целочисленный индекс (по порядку, в котором были добавлены элементы). SortedDictionary - элементы сортируются автоматически
источник
Словарь быстрее, чем хеш-таблица, так как словарь является универсальным строгим типом. Hashtable работает медленнее, так как принимает объект как тип данных, что приводит к упаковке и распаковке.
источник