Почему словарь предпочтительнее, чем Hashtable в C #? - PullRequest
1303 голосов
/ 19 ноября 2008

В большинстве языков программирования словари предпочтительнее хеш-таблиц. Каковы причины этого?

Ответы [ 19 ]

12 голосов
/ 19 ноября 2008

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

11 голосов
/ 25 января 2010

Обратите внимание, что MSDN говорит: «Словарь <(Of <(TKey, TValue>)>) реализован в виде хеш-таблицы », а не «Dictionary <(Of <(TKey, TValue>) >) класс реализован как HashTable"

Словарь НЕ реализован как HashTable, но он реализован в соответствии с концепцией хеш-таблицы. Реализация не связана с классом HashTable из-за использования Generics, хотя внутри Microsoft могла бы использовать тот же код и заменить символы типа Object на TKey и TValue.

В .NET 1.0 Generics не существовало; именно здесь изначально начинались HashTable и ArrayList.

8 голосов
/ 13 июля 2016

HashTable:

Ключ / значение будут преобразованы в тип объекта (бокс) при сохранении в куче.

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

Эти операции очень дороги. Нам нужно как можно больше избегать коробок / распаковок.

Словарь: Общий вариант HashTable.

Нет бокса / распаковки. Преобразование не требуется.

8 голосов
/ 01 мая 2014

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

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

Для дальнейшего чтения: Типы хеш-таблиц и коллекций словарей

6 голосов
/ 12 ноября 2015

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

В случае словаря нет безопасности потока; если вам нужна безопасность потоков, вы должны реализовать собственную синхронизацию.

Для уточнения:

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

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

Если вам нужна безопасность типов, а также безопасность потоков, используйте классы одновременных коллекций в .NET Framework. Дальнейшее чтение здесь .

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

6 голосов
/ 22 мая 2012

Dictionary<> является универсальным типом, поэтому он безопасен.

Вы можете вставить любой тип значения в HashTable, и это может иногда вызывать исключение. Но Dictionary<int> будет принимать только целые значения, а Dictionary<string> будет принимать только строки.

Итак, лучше использовать Dictionary<> вместо HashTable.

6 голосов
/ 17 апреля 2009

Еще одно различие, которое я могу понять:

Мы не можем использовать словарь (generics) с веб-сервисами. Причина в том, что ни один стандарт веб-службы не поддерживает стандарт дженериков.

0 голосов
/ 06 марта 2019

В большинстве языков программирования словари предпочтительнее хеш-таблиц

Не думаю, что это обязательно так, у большинства языков есть один или другой, в зависимости от терминологии , которую они предпочитают .

Однако в C # очевидной причиной (для меня) является то, что C # HashTables и другие члены пространства имен System.Collections в значительной степени устарели. Они присутствовали в c # V1.1. Они были заменены из C # 2.0 классами Generic в пространстве имен System.Collections.Generic.

0 голосов
/ 09 марта 2010

Согласно тому, что я вижу с помощью .NET Reflector :

[Serializable, ComVisible(true)]
public abstract class DictionaryBase : IDictionary, ICollection, IEnumerable
{
    // Fields
    private Hashtable hashtable;

    // Methods
    protected DictionaryBase();
    public void Clear();
.
.
.
}
Take note of these lines
// Fields
private Hashtable hashtable;

Так что мы можем быть уверены, что DictionaryBase использует HashTable внутри.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...