Когато научите нов компютърен език, едно от първите неща, които често задавате, е как да работите с големи групи данни. Тази тема често се обхваща под темата „Структури на данните“. Ако копаете по-дълбоко, трябва да заобиколите теми като свързани списъци, опашки, стекове и двоични дървета сред много други структури от данни. В Java тези структури са част от Java Collections Framework. Колекцията не е нищо друго, освен вид структура от данни, която се отнася до групиране на множество елементи от данни и Java Collections Framework стандартизира начина, по който се обработват тези групи обекти. Всъщност рамката на колекциите е създадена, за да отговори на няколко цели.
Цялата рамка на колекциите е проектирана около набор от стандартни интерфейси. Няколко стандартни реализации като LinkedList, HashSet и TreeSet се предоставят чрез тези интерфейси, които може да имате. Освен това можете да внедрите и собствената си колекция, ако решите. Въпреки това, в допълнение към колекциите, рамката определя няколко картови интерфейса и класове. Java съдържа три реализации на карта с общо предназначение - HashMap, TreeMap и LinkedHashMap - които съхраняват двойки ключ / стойност. Въпреки че картите не са технически колекции, те са напълно интегрирани с колекции. Всъщност картите се фокусират върху групите за свързване между обекти. Тази статия обобщава основните разлики между HashMap и HashSet.
HashMap е най-често използваната реализация на интерфейса Map, който предоставя основен карта ключ / стойност, където елементите са неподредени. Той използва специална стойност, наречена хеш код, вместо бавно търсене на ключа. Хеш-кодът е начин да се вземе информация във въпросния обект и да се превърне в „сравнително уникален“ int за този обект. Той просто работи на принципа на хеширане, което означава, че използва хеш функция за картографиране на идентифициращи стойности. Точно както Vector и Stack имат своите замествания в ArrayList и LinkedList, Hashtable има подмяна в HashMap. Той разширява AbstractMap, за да реализира интерфейса на Map, използвайки вътрешно Hashtable представителство. И подобно на други реализации с общо предназначение, HashMap поддържа опционалните методи на Map, позволява нулеви стойности и не е синхронизиран.
HashSet е един от членовете на Java Collections Framework, който реализира интерфейса Set, подкрепен от хеш таблица, която всъщност е екземпляр HashMap. Както подсказва името, той се реализира от хеш таблица, масив, в който елементите се съхраняват в позиция, получена от тяхното съдържание. За разлика от Map, Set е точно колекция с абсолютно същия интерфейс, така че няма допълнителна функционалност, както има с два различни списъка. HashSet използва хешираща функция, която е създадена специално за бързи търсения. Това е неподредена колекция от уникални обекти, която не може да съхранява дублиращи се стойности. HashSet разширява класа AbstractSet, който реализира Set интерфейс. HashSet обаче не определя никакви допълнителни методи, различни от тези, предоставени от неговите суперкласове и интерфейси.
HashMap е най-често използваната реализация на интерфейса Map, който предоставя основен карта ключ / стойност, където елементите са неподредени. Той просто работи на принципа на хеширане, което означава, че използва хеш функция за картографиране на идентифициращи стойности. HashSet, от друга страна, е един от членовете на Java Collections Framework, който реализира интерфейса Set, подкрепен от хеш таблица, която всъщност е екземпляр HashMap. Просто казано, HashMap реализира интерфейса на Map, докато HashSet реализира интерфейса Set.
HashSet създава колекция, която използва хеш таблица за съхранение. Хеш таблицата съхранява информация, използвайки метод, наречен хеширане. HashSet използва хеширане функция, която е специално разработена за бързо търсене, за да съхранява елементи или стойности. По-голямата част от функционалността на HashSet се осигурява чрез суперкласа AbstractCollection и AbstractSet, който HashSet споделя с TreeSet. HashMap разширява AbstractMap за внедряване на интерфейса на Map, използвайки вътрешно Hashtable представяне. И двата класа не са синхронизирани, което означава, че не са подходящи за безопасни нишки операции.
Тъй като Map не поддържа дублиращи се ключове, HashMap не позволява дублиращи се ключове, но е позволено да има дублирани стойности. Това означава, че дублиращи се стойности могат да съществуват в HashMap, но можете да използвате събирането като стойност срещу някой ключ. Всеки ключ трябва да е уникален в HashMap и не може да се разреши да има повече от 1 стойност. HashSet, от друга страна, не може да има дублиращи се елементи чрез самото определение на Set, което означава, че не можете да съхранявате дублиращи се стойности в HashSet. HashMap позволява само един нулев ключ, но позволява произволен брой нулеви стойности, докато HashSet позволява само една нулева стойност.
HashMap работи на принципа на хеширане, което означава, че използва хеш функция за картографиране на идентифициращи стойности, използвайки алгоритъма на хеширане, за да позволи лесно извличане. Истинският хеширащ механизъм винаги връща един и същ hashCode (), когато се прилага към същия обект. HashSet, от друга страна, използва вътрешно HashMap като резервна структура на данни за добавяне или съхраняване на обекти. Това означава, че когато е създаден обект на HashSet, той ще създаде обект на HashMap.
Въпреки че и HashMap, и HashSet не са синхронизирани, което означава, че не са подходящи за безопасни за нишки операции и те са напълно различни конструкции, те осигуряват постоянна производителност във времето за основни операции, като добавяне, премахване на елемент и др. интерфейсът Map, който съхранява двойки ключ / стойност, HashSet е реализация на Set интерфейса. A HashSet използва HashMap, за да подкрепи изпълнението му. HashMap обаче използва хеширащ принцип и го използва за бързо търсене на ключа.