Различие между словарем и хеш-таблицей [дубликат]

Может кто-нибудь сказать мне, есть ли альтернативный способ генерации этого метода, который работает как для примитивных, так и для не примитивных типов?

Вы не можете этого сделать. У вас не может быть одного объекта метода, который работает для foo(int) и foo(Integer). Потому что это будут два разных метода.

Причина, по которой компилятор позволяет вам вызывать некоторые foo(Integer) с помощью foo(5), заключается в том, что компилятор использует бокс, чтобы превратить 5 в объект Integer, а затем передать его.

Помните: компилятор решает во время компиляции, какой метод будет вызван. Когда есть два метода с одинаковыми именами с разными типами аргументов, это перегрузка ... и происходит во время компиляции.

Короче говоря: либо вы должны создать два объекта метода, либо вы должны предоставить необходимый код для вставки / распаковки между примитивными и упакованными ссылочными типами по мере необходимости!

106
задан Community 23 May 2017 в 12:17
поделиться

5 ответов

Проще говоря, Dictionary является универсальным типом, позволяющим:

  • статическую типизацию (и компиляцию -время проверки)
  • использовать без упаковки

Если у вас .NET 2.0 или выше, вы должны предпочесть Dictionary (и другие общие коллекции)

Тонкое, но важное отличие состоит в том, что Hashtable поддерживает несколько потоков чтения с одним потоком записи, тогда как Dictionary не обеспечивает безопасности потоков. Если вам нужна потокобезопасность с помощью универсального словаря, вы должны реализовать собственную синхронизацию или (в .NET 4.0) использовать ConcurrentDictionary .

192
ответ дан 24 November 2019 в 03:45
поделиться

Словарь введен (так что типы значений не нуждаются в боксе) ), Hashtable - нет (поэтому типы значений нуждаются в боксе). Hashtable имеет более приятный способ получения значения, чем словарь IMHO, потому что он всегда знает, что значение является объектом. Хотя, если вы используете .NET 3.5, легко написать метод расширения для словаря, чтобы добиться аналогичного поведения.

Если вам нужно несколько значений для каждого ключа, посмотрите мой исходный код MultiValueDictionary здесь: multimap в .NET

12
ответ дан 24 November 2019 в 03:45
поделиться

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

Существует некоторая особая разница между двумя, которую необходимо учитывать:

HashTable: неуниверсальная коллекция, самые большие накладные расходы в этом коллекция состоит в том, что он автоматически упаковывает ваши ценности и чтобы получить исходное значение, вам необходимо выполнить распаковку, они уменьшают производительность вашего приложения в качестве штрафа.

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

Второе существенное отличие:

если вы пытались получить доступ к значению из хеш-таблицы на основе ключа, который не существует, он вернет null. но в случае Словарь, который даст вам KeyNotFoundException.

6
ответ дан 24 November 2019 в 03:45
поделиться

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

.
22
ответ дан 24 November 2019 в 03:45
поделиться

Интерфейс ILookup используется в .net 3.5 с linq.

HashTable - базовый класс, который слабо типизирован; DictionaryBase абстрактный класс имеет строгую типизацию и использует внутри себя HashTable.

Я обнаружил странную вещь в Dictionary, когда мы добавляем несколько записей в Dictionary, порядок добавления записей сохраняется. Таким образом, если я применю foreach к Dictionary, я получу записи в том же порядке, в котором я их вставлял.

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

Что касается того, почему они ведут себя по-разному, то это потому, что Generic Dictionary реализует hashtable, но не основан на System.Collections.Hashtable. Реализация Generic Dictionary основана на выделении пар ключ-значение из списка. Затем они индексируются с помощью ведер хэш-таблицы для произвольного доступа, но когда она возвращает перечислитель, она просто проходит по списку в последовательном порядке - это будет порядок вставки, пока записи не используются повторно.

Шив Говинд Birlasoft.:)

3
ответ дан 24 November 2019 в 03:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: