Хеш таблица и словарь разница
What is the difference between Dictionary and Hashtable. How to decide which one to use?
It seems that this question should be closed as a duplicate, and its answers merged with one of the duplicates.
Создание хэш-таблиц
Чтобы создать хэш-таблицу, следуйте приведенным ниже рекомендациям.
- Начните хэш-таблицу со знака @ @.
- Заключите хэш-таблицу в фигурные скобки ( <> ).
- Введите одну или несколько пар "ключ-значение" для содержимого хэш-таблицы.
- Используйте знак равенства ( = ) для отделения каждого ключа от его значения.
- Используйте точку с запятой ( ; ) или разрыв строки для разделения пар "ключ-значение".
- Ключи, содержащие пробелы, должны быть заключены в кавычки. Значения должны быть допустимыми выражениями PowerShell. Строки должны быть заключены в кавычки, даже если они не содержат пробелов.
- Чтобы управлять хэш-таблицей, сохраните ее в переменной.
- При назначении упорядоченной хэш-таблицы переменной поместите атрибут [ordered] перед @ символом. Если поместить его перед именем переменной, команда завершится ошибкой.
Чтобы создать пустую хэш-таблицу в значении $hash, введите:
При создании хэш-таблицы можно также добавить в нее ключи и значения. Например, следующая инструкция создает хэш-таблицу с тремя ключами.
Создание объектов из хэш-таблиц
Начиная с PowerShell 3,0, можно создать объект из хэш-таблицы свойств и значений свойств.
Синтаксис выглядит следующим образом:
Этот метод работает только для классов, имеющих конструктор со значением NULL, то есть конструктор, не имеющий параметров. Свойства объекта должны быть общедоступными и настраиваемыми.
Дополнительные сведения см. в разделе about_Object_Creation.
Подробное описание
Хэш-таблица, также называемая словарем или ассоциативным массивом, представляет собой компактную структуру данных, в которой хранится одна или несколько пар "ключ-значение". Например, хэш-таблица может содержать ряд IP-адресов и имен компьютеров, где IP-адреса являются ключами, а имена компьютеров — значениями, и наоборот.
В PowerShell каждая хэш-таблица является объектом Hashtable (System. Collections. Hashtable). В PowerShell можно использовать свойства и методы объектов Hashtable.
Начиная с PowerShell 3,0, можно использовать атрибут [ordered] для создания упорядоченного словаря (System. Collections. специализированные. ордереддиктионари) в PowerShell.
Упорядоченные словари отличаются от хэш-таблиц тем, что ключи всегда отображаются в порядке их перечисления. Порядок ключей в хэш-таблице не определен.
Хэш-таблицы часто используются, так как они очень эффективны для поиска и извлечения данных. Хэш-таблицы можно использовать для хранения списков и создания вычисляемых свойств в PowerShell. И PowerShell имеет командлет, ConvertFrom-StringData , который преобразует строки в хэш-таблицу.
Типы объектов в хэш-таблицах
Следующая инструкция создает хэш-таблицу строк имени процесса и значения объекта Process и сохраняет их в $p переменной.
Можно отобразить хэш-таблицу в $p и использовать свойства Key-Name для вывода значений.
Ключи в хэш-таблице могут также иметь любой тип .NET. Следующая инструкция добавляет пару "ключ-значение" в хэш-таблицу в $p переменной. Ключ — это объект службы, представляющий службу WinRM, а значение — Текущее состояние службы.
Вы можете отобразить новую пару "ключ-значение" и получить к ней доступ с помощью тех же методов, которые используются для других пар в хэш-таблице.
Ключи и значения в хэш-таблице также могут быть объектами Hashtable. Следующая инструкция добавляет пару "ключ-значение" в хэш-таблицу в $p переменной, в которой ключ является строкой, Hash2, а значение — хэш-таблицей с тремя парами "ключ-значение".
Вы можете отображать новые значения и получать к ним доступ с помощью тех же методов.
Отображение хэш-таблиц
Чтобы отобразить хэш-таблицу, сохраненную в переменной, введите имя переменной. По умолчанию хэш-таблицы отображаются в виде таблицы с одним столбцом для ключей и одной для значений.
Хэш-таблицы имеют свойства "ключи" и "значения". Используйте точечную нотацию для вывода всех ключей или всех значений.
Каждое имя ключа является также свойством хэш-таблицы, а его значением является значение свойства Key-Name. Используйте следующий формат для вывода значений свойств.
Если имя ключа конфликтует с одним из имен свойств типа HashTable, можно использовать PSBase для доступа к этим свойствам. Например, если имя ключа равно keys и необходимо вернуть коллекцию ключей, используйте следующий синтаксис:
Хэш-таблицы имеют свойство Count, которое указывает количество пар "ключ-значение" в хэш-таблице.
Таблицы хэш-таблиц не являются массивами, поэтому нельзя использовать целое число в качестве индекса в хэш-таблице, но можно использовать имя ключа для индексации в хэш-таблице. Если ключ является строковым значением, заключите имя ключа в кавычки.
Синтаксис
Синтаксис хэш-таблицы выглядит следующим образом:
Синтаксис упорядоченного словаря выглядит следующим образом:
Атрибут [ordered] появился в PowerShell 3,0.
Создание упорядоченных словарей
Можно создать упорядоченный словарь, добавив объект типа ордереддиктионари , но самым простым способом создания упорядоченного словаря является использование [ordered] атрибута.
[ordered] Атрибут введен в PowerShell 3,0.
Поместите атрибут непосредственно перед символом "@".
Упорядоченные словари можно использовать так же, как и хэш-таблицы. Любой из этих типов можно использовать в качестве значения параметров, которые принимают хэш-таблицу или словарь (iDictionary).
Можно привести упорядоченный словарь к хэш-таблице, но нельзя восстановить упорядоченный атрибут, даже если очистить переменную и ввести новые значения. Для повторного создания заказа необходимо удалить и повторно создать переменную.
Сортировка ключей и значений
Элементы в хэш-таблице неупорядочены по отдельности. Пары "ключ-значение" могут отображаться в отдельном порядке при каждом их отображении.
Хотя хэш-таблицу нельзя отсортировать, можно использовать метод GetEnumerator хэш-таблиц для перечисления ключей и значений, а затем использовать командлет Sort-Object для сортировки перечисленных значений для вывода.
Например, следующие команды перечисляют ключи и значения в хэш-таблице в $p переменной, а затем сортируют эти ключи в алфавитном порядке.
Следующая команда использует ту же процедуру для сортировки хэш-значений в порядке убывания.
Добавление и удаление ключей и значений
Чтобы добавить ключи и значения в хэш-таблицу, используйте следующий формат команды:
Например, чтобы добавить в хэш-таблицу ключ "Time" со значением "Now", используйте следующий формат инструкции.
Также можно добавить ключи и значения в хэш-таблицу с помощью метода Add объекта System. Collections. Hashtable. Метод Add имеет следующий синтаксис:
Например, чтобы добавить в хэш-таблицу ключ "Time" со значением "Now", используйте следующий формат инструкции.
Кроме того, можно добавить ключи и значения в хэш-таблицу с помощью оператора сложения ( + ), чтобы добавить хэш-таблицу в существующую хэш-таблицу. Например, следующая инструкция добавляет ключ "Time" со значением "Now" в хэш-таблицу в переменной $hash.
Можно также добавлять значения, хранящиеся в переменных.
Оператор вычитания нельзя использовать для удаления пары "ключ-значение" из хэш-таблицы, но можно использовать метод Remove объекта Hashtable. Метод Remove принимает ключ в качестве значения.
Метод Remove имеет следующий синтаксис:
Например, чтобы удалить пару "время = теперь ключ — значение" из хэш-таблицы в значении переменной $hash, введите:
Вы можете использовать все свойства и методы объектов Hashtable в PowerShell, включая Contains, Clear, Clone и CopyTo. Дополнительные сведения об объектах Hashtable см. в разделе System. Collections. Hashtable.
7 Answers 7
Simply, Dictionary is a generic type, allowing:
- static typing (and compile-time verification)
- use without boxing
Lets give an example that would explain the difference between hashtable and dictionary.
Here is a method that implements hashtable
The following is for dictionary
Superb answer,Also you can use DictionaryEntry for enumerate over Hashtable.Ex: foreach(DictionaryEntry dnty in objHashTable )
There is one more important difference between a HashTable and Dictionary. If you use indexers to get a value out of a HashTable, the HashTable will successfully return null for a non-existent item, whereas the Dictionary will throw an error if you try accessing a item using a indexer which does not exist in the Dictionary
Good tip indeed, I had forgotten about that interface. I looked at the implementation in the BCL but it's indeed immutable so pretty much useless for every-day multi-value usage ;). I'll add the interface.
Hmm, there's a problem with ILookup<>: it also implements an Enumerator, which is different from the Dictionary enumerator. When a Linq operator is used on the multivaluedictionary, it can't chose which enumerator to use as it also can use IEnumerable
Want to add a difference:
Trying to acess a inexistent key gives runtime error in Dictionary but no problem in hashtable as it returns null instead of error.
here no error for key 0 & also for key "ten"(note: t is small)
here error for key 0 & also for key 10 as both are inexistent in dictionary, runtime error, while try to acess.
I suppose you should be using LINQ to find the FirstOrDefault item if you are trying to work with a collection outside foreach and for.
There is Some special difference between two which must be considered:
HashTable: is non-generic collection ,the biggest overhead of this collection is that it does boxing automatically for your values and in order to get your original value you need to perform unboxing , these to decrease your application performance as penalty.
Dictionary: This is generic type of collection where no implicit boxing, so no need to unboxing you will always get your original values which you were stored so it will improve your application performance.
the Second Considerable difference is:
if your were trying to access a value on from hash table on the basis of key that does not exist it will return null.But in the case of Dictionary it will give you KeyNotFoundException.
словарь-это общая концепция, которая отображает ключи на значения. Существует множество способов реализации такого сопоставления.
хэш-таблица-это конкретный способ реализации словаря.
кроме того, хеш-таблицы, еще один распространенный способ реализации словарей красно-черные деревья.
каждый метод имеет свои плюсы и минусы. Красно-черное дерево всегда может выполнить поиск в O (log N). Хэш-таблица может выполнять поиск в O (1) Время, хотя это может в зависимости от входных данных деградируйте до O(N).
словарь-это структура данных, которая сопоставляет ключи со значениями.
хэш-таблица-это структура данных, которая сопоставляет ключи со значениями, принимая хэш-значение ключа (применяя к нему некоторую хэш-функцию) и сопоставляя его с ведром, в котором хранится одно или несколько значений.
IMO это аналогично вопросу о разнице между списком и связанным списком.
для ясности может быть важно отметить, что это может быть так, что Python в настоящее время реализует их словари используют хэш-таблицы, и в будущем Python может изменить этот факт, не заставляя их словари перестать быть словарями.
"словарь" имеет несколько различных значений в программировании, как Википедия скажет вам -- "ассоциативный массив", смысл, в котором Python использует термин (также известный как" отображение"), является одним из этих значений (но" словарь данных "и" атаки словаря " в попытках угадать пароль также важны).
хэш-таблицы являются важными структурами данных; Python использует их для реализации двух важных встроенных типов данных dict и set .
Так, даже в Python вы не можете считать "хэш-таблицу" синонимом "словаря". поскольку аналогичная структура данных также используется для реализации "наборы"!-)
словарь Python внутренне реализован с помощью хэш-таблицы.
хэш-таблица всегда использует некоторую функцию, работающую со значением, чтобы определить, где будет храниться значение. Словарь (как я полагаю, вы намереваетесь это сделать) является более общим термином и просто указывает механизм поиска, который может быть хэш-таблицей или может быть реализован более простой структурой, которая не учитывает само значение при определении его местоположения хранения.
словарь реализован с использованием хэш-таблиц. На мой взгляд, разницу между 2 можно рассматривать как разницу между стеками и массивами, где мы будем использовать массивы для реализации стеков.
в большинстве языков программирования, словари предпочтительнее, чем хеш-таблицы. Каковы причины этого?
для чего это стоит, словарь и (концептуально) хэш-таблице.
если вы имели в виду " почему мы используем Dictionary класс вместо Hashtable класса?- тогда ответ прост: Dictionary универсального типа, Hashtable нет. Это означает, что вы получаете тип безопасности с Dictionary , потому что вы не можете вставить в него случайный объект, и вам не нужно отбрасывать значения, которые вы берете.
общий словарь был скопирован из источника Hashtable
Dictionary >> Hashtable отличия:
Dictionary / Hashtable сходство:
- как внутренне хеш-таблицы == быстрый доступ к данным много-деталя согласно ключу
- как надо неизменяемые и уникальные ключи
- ключи обоих нужно иметь GetHashCode() метод
- ConcurrentDictionary - thread safe (можно безопасно получить доступ из нескольких потоков одновременно)
- HybridDictionary - оптимизация производительности (для немногих деталей и также для много деталей)
- OrderedDictionary - значения могут быть доступ через int index (в порядке добавления элементов)
- SortedDictionary - статьи автоматически сортируются
- StringDictionary - со строгой типизацией и оптимизирован для строки
, потому что Dictionary является общим классом ( Dictionary ), Так что доступ к его содержимому является типобезопасным (т. е. вам не нужно бросать из Object , а ты Hashtable ).
, Dictionary реализуется как Hashtable внутри, так что технически это работает точно так же.
к вашему сведению: во .Чистая, Hashtable является потокобезопасным для использования несколькими потоками чтения и одним потоком записи, в то время как в Dictionary открытые статические члены являются потокобезопасными, но любые члены экземпляров не гарантируется потокобезопасность.
нам пришлось изменить все наши словари на Hashtable из-за этого.
люди говорят, что словарь-это то же самое, что и хэш-таблица.
вы также можете реализовать словарь со связанным списком или деревом поиска, он просто не будет таким эффективным (для некоторых показателей эффективности).
давайте рассмотрим пример:
HashTable
словарь
словарь:
возвращает/бросает исключение, если мы пытаемся найти ключ, который не существует.
это быстрее, чем хэш-таблица, потому что нет бокса и распаковки.
только общедоступные статические члены являются потокобезопасными.
словарь является общим типом, что означает, что мы можем использовать его с любым типом данных (при создании необходимо указать типы данных для обоих ключей и значения.)
- Диктивного тип-безопасная реализация Hashtable, Keys и Values строго типизированы.
Hashtable:
он возвращает null, если мы пытаемся найти ключ, который не существует.
Это медленнее, чем словарь, потому что он требует упаковки и распаковки.
все члены в хэш-таблице являются потокобезопасными,
Hashtable не является общим типом,
Hashtable-это слабо типизированная структура данных, мы можем добавлять ключи и значения любого типа.
если вы используете Dictionary и всегда устанавливайте значение null чтобы имитировать тип безопасной хэш-таблицы, вы должны, возможно, рассмотреть вопрос о переключении на HashSet .
класс Hashtable использует метод, называемый rehashing.
Rehashing работает следующим образом: существует набор хэш - функций, H1 . Hn, и при вставке или извлечении элемента из хэш таблица, изначально H1 используется хэш-функция. Если это приводит к столкновение, H2 вместо этого пробуется и далее до Hn при необходимости.
словарь использует метод, называемый сцепление.
при повторном хэшировании в случае столкновения хэш пересчитывается, и пробуется новый слот, соответствующий хэшу. С цепями, однако,вторичная структура данных используется для хранения любые столкновения. В частности, каждый слот в словаре массив элементов, которые соответствуют этому ведру. В случае столкновения элемент colliding добавляется в список bucket.
на Hashtable - это слабо типизированная структура данных, поэтому вы можете добавлять ключи и значения любого типа в Hashtable . The Dictionary класс является типобезопасным Hashtable реализация, а ключи и значения строго типизированы. При создании Dictionary экземпляр, необходимо указать типы данных как для ключа, так и для значения.
обратите внимание, что MSDN говорит: "класс Dictionary)>) реализован как хэш-таблицы", не " словарь)>) класс реализован как HashTable"
словарь не реализован как хэш-таблица, но он реализован в соответствии с концепцией хэш-таблицы. Реализация не связана с классом HashTable из-за использования дженериков, хотя внутренне Microsoft могла бы использовать тот же код и заменить символы типа Object с TKey и TValue.
объект Hashtable состоит из ведер, содержащих элементы коллекции. Ведро-это виртуальная подгруппа элементов в хэш-таблице,что делает поиск и извлечение проще и быстрее, чем во многих коллекциях.
класс Dictionary имеет ту же функциональность, что и класс Hashtable. Словарь определенного типа (кроме Object) имеет лучшую производительность, чем Hashtable для типов значений, потому что элементы Hashtable имеют тип Object и, следовательно, бокс и распаковка обычно происходят при сохранении или получении типа значения.
HashTable:
ключ / значение будет преобразован в тип объекта (бокса) при хранении в куче.
ключ / значение необходимо преобразовать в нужный тип при чтении из кучи.
эти операции очень дорогостоящие. Нам нужно избегать бокса / распаковки как можно больше.
словарь : общий вариант HashTable.
нет бокс/распаковка. Преобразование не требуется.
еще одно отличие, которое я могу понять:
мы не можем использовать словарь (generics) с веб-службами. Причина в том, что стандарт веб-службы не поддерживает стандарт generics.
Dictionary<> является общим типом,и поэтому он безопасен.
вы можете вставить любой тип значения в HashTable, и это иногда может вызвать исключение. Но!--1--> будет принимать только целочисленные значения, а так же Dictionary принимает только строки.
Итак, лучше использовать Dictionary<> вместо HashTable .
другое важное различие заключается в том, что Hashtable является потокобезопасным. Hashtable имеет встроенную множественную безопасность потока читателя/одиночного писателя (MR/SW) которая значит что Hashtable позволяет одному писателю вместе с множественными читателями без фиксировать.
в случае словаря нет безопасности потоков; если вам нужна безопасность потоков, вы должны реализовать свою собственную синхронизацию.
дополнительная разница заключается в том, что при добавлении нескольких записей в словаре сохраняется порядок добавления записей. Когда мы получим элементы из словаря, мы получим записи в том же порядке, в котором мы их вставили. В то время как Hashtable не сохраняет порядок вставки.
в чем разница между Dictionary и Hashtable и как мне работать с Dictionary класс на Java?
Dictionary является абстрактным базовым классом Hashtable . Оба еще в JDK для обратной совместимости со старым кодом. Мы должны использовать HashMap и другие реализации Map интерфейс, представленный в Java 1.2.
javadoc для словарь есть ваш ответ.
класс Dictionary является абстрактным родителем любого класса, например Hashtable, который сопоставляет ключи со значениями.
вы не работаете непосредственно с Dictionary , Так как это abstract класса.
Также обратите внимание на следующие из той же документации:
Примечание: этот класс устарел. Новые реализации должны реализовать карта интерфейс, а не расширение этого класса.
Dictionary - абстрактный класс, суперкласс Hashtable . Вы не должны использовать Dictionary Как это устаревшего. Что касается Hashtable, то преимущество перед другими картами, такими как HashMap была безопасность потоков, но с введением ConcurrentHashMap с Java 1.5 нет реальной причины использовать его больше-см. javadoc
начиная с платформы Java 2 v1.2, Этот класс был модифицирован для реализации интерфейса карты, что делает его член Java Collections Framework. В отличие от новых реализаций коллекции, Hashtable является синхронизированной. Если потокобезопасная реализация не требуется, рекомендуется использовать HashMap вместо Hashtable. Если требуется потокобезопасная параллельная реализация, рекомендуется использовать ConcurrentHashMap вместо Hashtable.
в резюме: не используйте Dictionary или Hashtable , Если вам действительно не нужно по соображениям совместимости, используйте либо HashMap Если вам не нужна потокобезопасность, или ConcurrentHashMap если ваша карта используется в параллельной среде.
Hashtable реализация Dictionary . Вы не можете использовать Dictionary напрямую, потому что это абстрактный класс.
но вы не должны использовать ни потому, что они были заменены Map интерфейс и реализующие классы, из которых HashMap самые популярные.
Я нашел лекцию о принципах ООП, которая содержит ответ, который вы ищете:
словарь Основной темой в вычислительной технике является тема хранения / извлечения / удаления: хранить данные где-то, чтобы позже их можно было извлечь и отбросить, если они больше не нужны, все это наиболее эффективным образом. Абстракция из этих вычислительных действий воплощено понятие того, что называется словарем, выраженное на Java как интерфейс следующим образом.
Хэш-Таблицы Хэш-таблица-это обобщение обычного массива. Когда количество фактически сохраненных ключей невелико относительно общего количества возможных ключей, хэш-таблицы становятся эффективными альтернатива прямой адресации массива, так как хэш-таблица обычно используется массив размера, пропорциональный количество ключей на самом деле хранится. Вместо того, чтобы использовать ключ в качестве индекса массива напрямую, индекс массива вычисляется из ключа. При хешировании элемент с ключом k хранится в слоте h (k); т. е. хэш-функция h используется для вычисления слота из ключа k. h отображает множество U ключей в слоты хэш-таблицы T[0..М-1]: h: U - >
класс Dictionary является абстрактным родителем любого класса, например Hashtable, который сопоставляет ключи со значениями. Каждый ключ и каждое значение-это объект. В любом объекте словаря каждый ключ связан не более чем с одним значением. Учитывая словарь и ключ, связанный элемент можно найти. Любой ненулевой объект может использоваться как ключ и как значение.
согласно javadocs для словаря:
Примечание: этот класс устарел. Новые реализации должны реализовать Интерфейс карты, а не расширение этого класса.
Hashtable-это JDK 1.0 vintage. Вы должны предпочесть интерфейс карты и его более современные реализации: HashMap и TreeMap.
Описывает создание, использование и сортировку хэш-таблиц в PowerShell.
ConvertFrom-StringData
Здесь строки особенно полезны, если значения в хэш-таблице содержат кавычки. Дополнительные сведения о строках см. в разделе about_Quoting_Rules.
Следующая команда создает строку "ключ-значение", а затем сохраняет ее в $string переменной.
Эта команда использует ConvertFrom-StringData командлет для преобразования строки Here в хэш-таблицу.
Читайте также: