Когато научите нов компютърен език, едно от първите неща, които често задавате, е как да работите с големи групи данни. Тази тема често се обхваща под темата „Структури на данните“. Ако копаете по-дълбоко, трябва да заобиколите теми като свързани списъци, опашки, стекове и двоични дървета сред много други структури от данни. В Java тези структури са част от Java Collections Framework. Колекцията не е нищо друго, освен вид структура от данни, която се отнася до групиране на множество елементи от данни и Java Collections Framework стандартизира начина, по който се обработват тези групи обекти. Всъщност рамката на колекциите е създадена, за да отговори на няколко цели.

Цялата рамка на колекциите е проектирана около набор от стандартни интерфейси. Няколко стандартни реализации като LinkedList, HashSet и TreeSet се предоставят чрез тези интерфейси, които може да имате. Освен това можете да внедрите и собствената си колекция, ако решите. Въпреки това, в допълнение към колекциите, рамката определя няколко картови интерфейса и класове. Java съдържа три реализации на карта с общо предназначение - HashMap, TreeMap и LinkedHashMap - които съхраняват двойки ключ / стойност. Въпреки че картите не са технически колекции, те са напълно интегрирани с колекции. Всъщност картите се фокусират върху групи на свързване между обекти. Тази статия обобщава основните разлики между HashMap и HashSet.

Какво е HashMap?

HashMap е най-често използваната реализация на интерфейса Map, който осигурява основна карта ключ / стойност, където елементите не са подредени. Той използва специална стойност, наречена хеш код, вместо бавно търсене на ключа. Хеш кодът е начин да се вземе информация във въпросния обект и да се превърне в „сравнително уникален“ int за този обект. Той просто работи на принципа на хеширане, което означава, че използва хеш функция за картографиране на идентифициращи стойности. Точно както Vector и Stack имат своите замествания в ArrayList и LinkedList, Hashtable има подмяна в HashMap. Той разширява AbstractMap, за да реализира интерфейса на Map, използвайки вътрешно Hashtable представителство. И подобно на други реализации с общо предназначение, HashMap поддържа опционалните методи на Map, позволява нулеви стойности и не се синхронизира.

Какво е HashSet?

HashSet е един от членовете на Java Collections Framework, който реализира интерфейса Set, подкрепен от хеш таблица, която всъщност е екземпляр HashMap. Както подсказва името, той се реализира от хеш таблица, масив, в който елементите се съхраняват в позиция, получена от тяхното съдържание. За разлика от Map, Set е точно колекция с абсолютно един и същ интерфейс, така че няма допълнителна функционалност като тази с два различни списъка. HashSet използва хеширане функция, която е създадена специално за бързи търсения. Това е неподредена колекция от уникални обекти, която не може да съхранява дублирани стойности. HashSet разширява класа AbstractSet, който реализира Set интерфейс. HashSet обаче не определя никакви допълнителни методи, различни от тези, предоставени от неговите суперкласове и интерфейси.

Разлика между HashMap и HashSet

  1. Основен

HashMap е най-често използваната реализация на интерфейса Map, който осигурява основна карта ключ / стойност, където елементите не са подредени. Той просто работи на принципа на хеширане, което означава, че използва хеш функция за картографиране на идентифициращи стойности. HashSet, от друга страна, е един от членовете на Java Collections Framework, който реализира интерфейса Set, подкрепен от хеш таблица, която всъщност е екземпляр HashMap. Просто казано, HashMap реализира интерфейса на Map, докато HashSet реализира интерфейса Set.

  1. Функционалност

HashSet създава колекция, която използва хеш таблица за съхранение. Хеш таблицата съхранява информация, използвайки метод, наречен хеширане. HashSet използва хеширане функция, която е специално разработена за бързо търсене, за да съхранява елементи или стойности. По-голямата част от функционалността на HashSet се осигурява чрез суперкласа AbstractCollection и AbstractSet, който HashSet споделя с TreeSet. HashMap разширява AbstractMap за внедряване на интерфейса на Map, използвайки вътрешно Hashtable представяне. И двата класа не са синхронизирани, което означава, че не са подходящи за безопасни нишки операции.

  1. Дублиращи се стойности

Тъй като Map не поддържа дублиращи се ключове, HashMap не позволява дублиращи се ключове, но е позволено да има дублирани стойности. Това означава, че дублиращи се стойности могат да съществуват в HashMap, но можете да използвате събирането като стойност срещу някой ключ. Всеки ключ трябва да бъде уникален в HashMap и не може да се разреши да има повече от 1 стойност. HashSet, от друга страна, не може да има дублиращи се елементи чрез самото определение на Set, което означава, че не можете да съхранявате дублиращи се стойности в HashSet. HashMap позволява само един нулев ключ, но позволява произволен брой нулеви стойности, докато HashSet позволява само една нулева стойност.

  1. Механизъм за съхранение

HashMap работи на принципа на хеширане, което означава, че използва хеш функция за картографиране на идентифициращи стойности, използвайки алгоритъма на хеширане, за да позволи лесно извличане. Истинският хеширащ механизъм винаги връща един и същ hashCode (), когато се прилага към същия обект. HashSet, от друга страна, използва вътрешно HashMap като резервна структура на данни за добавяне или съхраняване на обекти. Това означава, че когато е създаден обект на HashSet, той ще създаде обект на HashMap.

HashMap срещу HashSet: Сравнителна диаграма

Обобщение на HashMap Vs. HashSet

Въпреки че и HashMap, и HashSet не са синхронизирани, което означава, че не са подходящи за безопасни за нишки операции и те са напълно различни конструкции, те осигуряват постоянна производителност във времето за основни операции като добавяне, премахване на елемент и др. Докато HashMap е реализация с общо предназначение интерфейсът Map, който съхранява двойки ключ / стойност, HashSet е реализация на Set интерфейса. A HashSet използва HashMap, за да подкрепи изпълнението му. HashMap обаче използва хеширащ принцип и го използва за бързо търсене на ключа.

Препратки

  • Зуковски, Джон. Java колекции. New York City: Apress, 2008. Печат
  • Еккел, Брус. Мислене на Java. Ню Джърси: Prentice Hall, 2003. Печат
  • Нафталин, Морис и Филип Вадлер. Java Generics and Collections. Себастопол, Калифорния: O'Reilly Media, 2006. Печат
  • Кредитна снимка: https://upload.wikimedia.org/wikipedia/commons/3/3b/Java_collection_set_implementations.jpg
  • Кредитна снимка: https://bg.wikipedia.org/wiki/Java_collections_framework#/media/File:Java.util.Map_hierarchy.svg