Вопрос: Почему Словарь предпочтительнее Hashtable?


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


1184


источник


Ответы:


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

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

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

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

Источник


1384



Dictionary<<< >>> Hashtableразличия:

  • общий <<< >>> Необщего
  • потребности синхронизация собственных потоков <<< >>> Предложения безопасный поток версии через Synchronized()метод
  • Перечисленный элемент: KeyValuePair<<< >>> Перечисленный элемент: DictionaryEntry
  • Более новый (> .NET 2.0 ) <<< >>> Старые (начиная с .NET 1.0 )
  • в System.Collections.Generic <<< >>> находится в System.Collections
  • Запрос несуществующего ключа исключение исключений <<< >>> Запрос на несуществующий ключ возвращает null
  • потенциально немного быстрее для типов значений <<< >>> бит медленнее (требуется бокс / распаковка) для типов значений

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

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

Аналогичный Коллекции .NET (кандидаты для использования вместо словаря и Hashtable):

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

557



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

сравнить

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

в

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

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


161



FYI: В .NET, Hashtableявляется потокобезопасным для использования несколькими потоками считывателей и одним потоком записи, в то время как в Dictionarypublic static members являются потокобезопасными, но любые члены экземпляра не гарантируют безопасность потоков.

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


79



In .NET, the difference between Dictionary<,> and HashTable is primarily that the former is a generic type, so you get all the benefits of generics in terms of static type checking (and reduced boxing, but this isn't as big as people tend to think in terms of performance - there is a definite memory cost to boxing, though).


59



People are saying that a Dictionary is the same as a hash table.

This is not necessarily true. A hash table is an implementation of a dictionary. A typical one at that, and it may be the default one in .NET, but it's not by definition the only one.

You could equally well implement a dictionary with a linked list or a search tree, it just wouldn't be as efficient (for some metric of efficient).


26



Collections & Generics are useful for handling group of objects. In .NET, all the collections objects comes under the interface IEnumerable, which in turn has ArrayList(Index-Value)) & HashTable(Key-Value). After .NET framework 2.0, ArrayList & HashTable were replaced with List & Dictionary. Now, the Arraylist & HashTable are no more used in nowadays projects.

Coming to the difference between HashTable & Dictionary, Dictionary is generic where as Hastable is not Generic. We can add any type of object to HashTable, but while retrieving we need to cast it to the required type. So, it is not type safe. But to dictionary, while declaring itself we can specify the type of key and value, so there is no need to cast while retrieving.

Let's look at an example:

HashTable

class HashTableProgram
{
    static void Main(string[] args)
    {
        Hashtable ht = new Hashtable();
        ht.Add(1, "One");
        ht.Add(2, "Two");
        ht.Add(3, "Three");
        foreach (DictionaryEntry de in ht)
        {
            int Key = (int)de.Key; //Casting
            string value = de.Value.ToString(); //Casting
            Console.WriteLine(Key + " " + value);
        }

    }
}

Dictionary,

class DictionaryProgram
{
    static void Main(string[] args)
    {
        Dictionary<int, string> dt = new Dictionary<int, string>();
        dt.Add(1, "One");
        dt.Add(2, "Two");
        dt.Add(3, "Three");
        foreach (KeyValuePair<int, String> kv in dt)
        {
            Console.WriteLine(kv.Key + " " + kv.Value);
        }
    }
}

19



Dictionary:

  • It returns/throws Exception if we try to find a key which does not exist.

  • It is faster than a Hashtable because there is no boxing and unboxing.

  • Only public static members are thread safe.

  • Dictionary is a generic type which means we can use it with any data type (When creating, must specify the data types for both keys and values).

    Example: Dictionary<string, string> <NameOfDictionaryVar> = new Dictionary<string, string>();

  • Dictionay is a type-safe implementation of Hashtable, Keys and Values are strongly typed.

Hashtable:

  • It returns null if we try to find a key which does not exist.

  • It is slower than dictionary because it requires boxing and unboxing.

  • All the members in a Hashtable are thread safe,

  • Hashtable is not a generic type,

  • Hashtable is loosely-typed data structure, we can add keys and values of any type.


13



Since .NET Framework 3.5 there is also a HashSet<T> which provides all the pros of the Dictionary<TKey, TValue> if you need only the keys and no values.

So if you use a Dictionary<MyType, object> and always set the value to null to simulate the type safe hash table you should maybe consider switching to the HashSet<T>.


13