Почему словарь предпочтительнее хэш-таблицы?

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

вопрос задан 19.11.2008
Nakul Chaudhary
9985 репутация

18 ответов


  • 1422 рейтинг

    Для словаря Dictionary это (концептуально) хеш-таблица.

    Если вы имели в виду «почему мы используем класс Dictionary вместо класса Hashtable? ", тогда это простой ответ: Dictionary - универсальный тип, Hashtable - нет. Это означает, что вы получаете безопасность типов с Dictionary, потому что вы не можете вставить в нее какой-либо случайный объект и вам не нужно приводить значения, которые вы вынимаете.

    Интересно, что реализация Dictionary в. NET Framework основан на Hashtable, как вы можете сказать из этого комментария в его исходном коде:

    Общий словарь был скопирован из источника Hashtable

    Источник

    ответ дан Michael Madsen, с репутацией 45736, 19.11.2008
  • 574 рейтинг

    Dictionary ; & gt; & gt; & gt; & gt; & gt; Hashtable различия:

    • Generic & lt; & gt; & gt; & gt; & gt; & gt; Неуниверсальный
    • Требуется синхронизация собственного потока & lt; & lt; & lt; & gt; & gt; & gt; & gt; Предлагает потокобезопасную версию через Synchronized() метод
    • Пронумерованный элемент: KeyValuePair & lt; & gt; & gt; & gt; & gt; & gt; Нумерованный элемент: DictionaryEntry
    • Новее (& gt; . NET 2. 0 ) & lt; & lt; & gt; & gt; & gt; & gt; Старше (с . NET 1. 0 )
    • находится в системе . Коллекции. Generic & lt; & lt; & gt; & gt; & gt; & gt; & gt; находится в системе . Коллекции
    • Запрос к несуществующему ключу выдает исключение & lt; & lt; & lt; & gt; & gt; & gt; Запрос к несуществующему ключу возвращает ноль
    • потенциально немного быстрее на для типов значений & lt; & lt; & lt; & gt; & gt; & gt; бит медленнее (требуется упаковка / распаковка) для типов значений

    Dictionary / Hashtable сходства:

    • Оба являются внутренними хеш-таблицами == быстрый доступ к данным многих элементов в соответствии с ключом
    • Оба требуют неизменяемых и уникальных ключей
    • Ключи обоих нужны собственные GetHashCode() метод

    Похожие . NET коллекции (кандидаты на использование вместо словаря и Hashtable):

    • ConcurrentDictionary - потокобезопасный (может быть безопасно доступен из нескольких потоков одновременно)
    • HybridDictionary - оптимизированная производительность (для нескольких предметов, а также для многих предметов)
    • OrderedDictionary - значения могут быть , доступ к которым осуществляется через индекс int (по порядку, в котором элементы были добавлены)
    • SortedDictionary - позиции автоматически отсортированы
    • StringDictionary - строго типизированный и , оптимизированный для строк
    ответ дан Thetam, с репутацией 8598, 21.04.2011
  • 164 рейтинг

    Поскольку Dictionary является универсальным классом (Dictionary), поэтому доступ к его содержимому является безопасным для типов (т.е. е. вам не нужно кастовать с Object, как вы делаете с Hashtable).

    Сравнить

    var customers = new Dictionary();
    ...
    Customer customer = customers["Ali G"];
    

    до

    var customers = new Hashtable();
    ...
    Customer customer = customers["Ali G"] as Customer;
    

    Однако, Dictionary реализован как Hashtable внутри, так что технически он работает так же.

    ответ дан gius, с репутацией 6351, 19.11.2008
  • 81 рейтинг

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

    Из-за этого нам пришлось изменить все наши словари обратно на Hashtable.

    ответ дан user38902, с репутацией 811, 19.11.2008
  • 63 рейтинг

    дюйма NET, разница между Dictionary<,> и HashTable заключается, прежде всего, в том, что первый тип является универсальным типом, поэтому вы получаете все преимущества универсальных типов с точки зрения статической проверки типов (и сокращения бокса, но это не так велико, как думают люди в С точки зрения производительности - для бокса есть определенная стоимость памяти).

    ответ дан Marc Gravell, с репутацией 759786, 19.11.2008
  • 28 рейтинг

    Люди говорят, что словарь такой же, как хеш-таблица.

    Это не обязательно верно. Хеш-таблица - это реализация 3230269583 словаря. Типичный в этом, и это может быть по умолчанию в. NET, но это по определению не единственный.

    С таким же успехом можно реализовать словарь со связанным списком или деревом поиска, но он не будет таким эффективным (по некоторым показателям эффективности).

    ответ дан rix0rrr, с репутацией 6725, 19.11.2008
  • 9 рейтинг

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

    ответ дан flesh, с репутацией 13433, 19.11.2008
  • 8 рейтинг

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

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

    дюйма NET 1. 0 дженериков не было; именно здесь изначально начинались HashTable и ArrayList.

    ответ дан Brant, с репутацией 81, 24.01.2010
  • 5 рейтинг

    Еще одно отличие, которое я могу выяснить, это:

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

    ответ дан rix0rrr, с репутацией 6725, 17.04.2009
  • 5 рейтинг

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

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

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

    ответ дан Kishore Kumar, с репутацией 8259, 22.05.2012
  • -1 рейтинг

    Согласно тому, что я вижу, используя . Отражатель NET :

    [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 внутри.

    ответ дан Brant, с репутацией 81, 9.03.2010