Разлика между речник и хеш-таблица

Разлика между речник и хеш-таблица
Разлика между речник и хеш-таблица

Видео: Разлика между речник и хеш-таблица

Видео: Разлика между речник и хеш-таблица
Видео: Гарвард. CS50 на русском. 1. Короткие видео. 1. Хэш таблицы 2024, Юли
Anonim

Речник срещу Hashtable

Речникът е въведен (така че типовете стойности не се нуждаят от кутии), а Hashtable не е (така че типовете стойности се нуждаят от кутии). Hashtable има по-добър начин за получаване на стойност от речника IMHО, защото винаги знае, че стойността е обект. Въпреки че, ако използвате. NET 3.5, е лесно да напишете метод за разширение за речника, за да получите подобно поведение.

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

Има още една важна разлика между HashTable и Dictionary. Ако използвате индексатори, за да получите стойност от HashTable, HashTable успешно ще върне null за несъществуващ елемент, докато Речникът ще издаде грешка, ако се опитате да получите достъп до елемент с помощта на индексатор, който не съществува в Речника.

The HashTable е основният клас, който е слабо типизиран; абстрактният клас DictionaryBase е строго въведен и използва вътрешно HashTable.

Странно нещо, забелязано в речника, е, че когато добавяме множество записи в речника, редът, в който се добавят записите, се запазва. По този начин, ако приложите foreach в речника, ще получите записите в същия ред, в който сте ги вмъкнали. Докато това не е вярно с нормалната HashTable, когато добавяте едни и същи записи в Hashtable, редът не се поддържа. Ако „Речникът е базиран на Hashtable“е вярно, защо речникът поддържа реда, а HashTable не го прави?

Що се отнася до причината, поради която се държат по различен начин, това е, защото Generic Dictionary имплементира хеш-таблица, но не е базиран на System. Cоllectiоns. Hashtable. Реализацията на общия речник се основава на разпределяне на двойки ключ-стойност от списък. След това те се индексират с блокчетата на хеш-таблицата за случаен достъп, но когато върне изброител, той просто обикаля списъка в последователен ред – който ще бъде редът на вмъкване, стига записите да не се използват повторно.

Препоръчано: