В большинстве языков программирования словари предпочтительнее хеш-таблиц. Каковы причины этого?
В большинстве языков программирования словари предпочтительнее хеш-таблиц. Каковы причины этого?
Для словаря Dictionary это (концептуально) хеш-таблица.
Если вы имели в виду «почему мы используем класс Dictionary
вместо класса Hashtable
? ", тогда это простой ответ: Dictionary
- универсальный тип, Hashtable
- нет. Это означает, что вы получаете безопасность типов с Dictionary
, потому что вы не можете вставить в нее какой-либо случайный объект и вам не нужно приводить значения, которые вы вынимаете.
Интересно, что реализация Dictionary
в. NET Framework основан на Hashtable
, как вы можете сказать из этого комментария в его исходном коде:
Общий словарь был скопирован из источника Hashtable
Dictionary
; & gt; & gt; & gt; & gt; & gt; Hashtable
различия:
Synchronized()
методKeyValuePair
& lt; & gt; & gt; & gt; & gt; & gt; Нумерованный элемент: DictionaryEntry
Dictionary
/ Hashtable
сходства:
GetHashCode()
методПохожие . NET коллекции (кандидаты на использование вместо словаря и Hashtable):
ConcurrentDictionary
- потокобезопасный (может быть безопасно доступен из нескольких потоков одновременно)HybridDictionary
- оптимизированная производительность (для нескольких предметов, а также для многих предметов)OrderedDictionary
- значения могут быть , доступ к которым осуществляется через индекс int (по порядку, в котором элементы были добавлены)SortedDictionary
- позиции автоматически отсортированыStringDictionary
- строго типизированный и , оптимизированный для строкПоскольку 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
внутри, так что технически он работает так же.
К вашему сведению: дюймы NET, Hashtable
является поточно-ориентированным для использования несколькими потоками считывателей и одним потоком записи, в то время как в Dictionary
открытые статические члены являются поточно-ориентированными, но ни один из элементов экземпляра не гарантированно безопасен для потоков.
Из-за этого нам пришлось изменить все наши словари обратно на Hashtable
.
дюйма NET, разница между Dictionary<,>
и HashTable
заключается, прежде всего, в том, что первый тип является универсальным типом, поэтому вы получаете все преимущества универсальных типов с точки зрения статической проверки типов (и сокращения бокса, но это не так велико, как думают люди в С точки зрения производительности - для бокса есть определенная стоимость памяти).
Люди говорят, что словарь такой же, как хеш-таблица.
Это не обязательно верно. Хеш-таблица - это реализация 3230269583 словаря. Типичный в этом, и это может быть по умолчанию в. NET, но это по определению не единственный.
С таким же успехом можно реализовать словарь со связанным списком или деревом поиска, но он не будет таким эффективным (по некоторым показателям эффективности).
Hashtable
- это структура данных со свободным типом, поэтому вы можете добавлять ключи и значения любого типа в Hashtable
. Класс Dictionary
является безопасным для типов реализацией Hashtable
, а ключи и значения строго типизированы. При создании экземпляра Dictionary
необходимо указать типы данных как для ключа, так и для значения.
Обратите внимание, что 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.
Еще одно отличие, которое я могу выяснить, это:
Мы не можем использовать словарь & lt; KT, VT & gt; (дженерики) с веб-сервисами. Причина в том, что стандарт веб-службы не поддерживает стандарт дженериков.
Dictionary<>
является универсальным типом и поэтому безопасен.
Вы можете вставить любой тип значения в HashTable, и это может иногда вызывать исключение. Но Dictionary
будет принимать только целочисленные значения и аналогично Dictionary
будет принимать только строки.
Итак, лучше использовать Dictionary<>
вместо HashTable
.
Согласно тому, что я вижу, используя . Отражатель 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 внутри.