.NET HashTable Vs Dictionary - Может ли словарь быть таким же быстрым?

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

Но я также прочитал Словарь, который не всегда будет возвращать объекты в том порядке, в котором они вставлены, вещь, которую она сортирует. Где, как HashTable, будет. Насколько я понимаю, это приводит к тому, что HashTable намного быстрее для некоторых ситуаций.

Мой вопрос действительно, какими могут быть эти ситуации? Я просто ошибаюсь в своих предположениях выше? В каких ситуациях вы можете выбирать один над другим (да, последний из них немного неоднозначен).

Ответ 1

Классы

System.Collections.Generic.Dictionary<TKey, TValue> и System.Collections.Hashtable поддерживают внутреннюю структуру данных хеш-таблицы. Ни один из них не гарантирует сохранение порядка элементов.

Уход от проблем с боксом/распаковкой, в большинстве случаев, они должны иметь очень схожую производительность.

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

Существует мало преимуществ для использования класса Hashtable, если вы настроите таргетинг на .NET Framework 2.0+. Это эффективно устарело Dictionary<TKey, TValue>.

Ответ 3

Еще одно важное отличие состоит в том, что тип Hashtable поддерживает блокировку нескольких считывателей и одного автора одновременно, в то время как в словаре нет.

Ответ 4

Различия между Hashtable и Dictionary

Словарь:

  • Словарь возвращает ошибку, если мы попытаемся найти ключ, который не существует.
  • Словарь быстрее, чем Hashtable, потому что нет бокса и распаковки.
  • Словарь - это общий тип, который означает, что мы можем использовать его с любым типом данных.

Hashtable:

  • Hashtable возвращает null, если мы пытаемся найти ключ, который не существует.
  • Hashtable медленнее, чем словарь, потому что он требует бокса и распаковки.
  • Hashtable не является общим типом,

Ответ 5

Статья MSDN: "Класс Dictionary<TKey, TValue> имеет то же самое как класс Hashtable. A Dictionary<TKey, TValue>определенного типа (кроме Object) имеет лучшую производительность, чем Hashtable для типов значений, поскольку элементы Hashtable имеют тип Object, и поэтому бокс и распаковка обычно возникают, если сохранение или извлечение типа значения".

Ссылка: http://msdn.microsoft.com/en-us/library/4yh14awz(v=vs.90).aspx

Ответ 6

Оба являются фактически одним и тем же классом (вы можете посмотреть на разборку). HashTable был создан прежде, чем .Net имел дженерики. Словарь, однако, является общим классом и дает вам сильные преимущества при наборе текста. Я бы никогда не использовал HashTable, так как Словарь стоил вам ничего не использовать.

Ответ 7

Другим важным отличием является то, что Hashtable является потокобезопасным. Hashtable имеет встроенную защиту потока нити/считывателя/одиночной записи (MR/SW), что означает Hashtable позволяет ОДНОМ автору вместе с несколькими считывателями без блокировки. В случае Dictionary нет безопасности потока, если вам нужна безопасность потоков, вы должны реализовать свою собственную синхронизацию.

Далее уточнить:

Hashtable обеспечивают некоторую безопасность потоков через свойство Synchronized, которое возвращает потокобезопасную оболочку вокруг коллекции. Обертка работает, блокируя всю коллекцию при каждой операции добавления или удаления. Поэтому каждый поток, пытающийся получить доступ к коллекции, должен дождаться, пока его очередь займет один замок. Это не является масштабируемым и может привести к значительной деградации производительности для больших коллекций. Кроме того, дизайн не полностью защищен от условий гонки.

Классы коллекции .NET Framework 2.0, такие как List<T>, Dictionary<TKey, TValue> и т.д., не обеспечивают ни одной синхронизации потоков; код пользователя должен обеспечивать всю синхронизацию, когда элементы добавляются или удаляются одновременно на нескольких потоках Если вам нужна безопасность типов, а также безопасность потоков, используйте параллельные классы коллекций в .NET Framework. Далее читайте здесь.

Ответ 8

Если вы заботитесь о чтении, которое всегда будет возвращать объекты в том порядке, в котором они вставляются в словарь, вы можете посмотреть

OrderedDictionary - доступ к значениям можно получить с помощью целочисленного индекса (по порядку, в котором были добавлены элементы) SortedDictionary - элементы автоматически сортируются

Ответ 9

Словарь быстрее, чем хеш-таблица, поскольку словарь является общим сильным типом. Hashtable работает медленнее, поскольку объект принимает объект как тип данных, что приводит к боксу и распаковке.