Keď sa naučíte nový počítačový jazyk, jednou z prvých vecí, ktorú sa zvyčajne pýtate, je to, ako pracovať s veľkými skupinami údajov. Táto téma je často zahrnutá v téme „Dátové štruktúry“. Ak budete kopať hlbšie, musíte medzi mnohými ďalšími štruktúrami údajov obísť témy, ako sú prepojené zoznamy, fronty, komíny a binárne stromy. V jazyku Java sú tieto štruktúry súčasťou rámca Java Collections Framework. Kolekcia nie je nič iné ako typ dátovej štruktúry, ktorá odkazuje na zoskupovanie viacerých dátových prvkov a Java Collection Framework štandardizuje spôsob, akým sa s týmito skupinami objektov zaobchádza. Rámec zbierok bol navrhnutý tak, aby splnil niekoľko cieľov.
Celý rámec kolekcií je navrhnutý na základe súboru štandardných rozhraní. Niekoľko štandardných implementácií, ako napríklad LinkedList, HashSet a TreeSet, poskytuje tieto rozhrania, ktoré môžu byť také, aké sú. Okrem toho môžete tiež implementovať svoju vlastnú zbierku, ak sa rozhodnete. Okrem kolekcií však rámec definuje niekoľko mapových rozhraní a tried. Java obsahuje tri všeobecné mapové implementácie - HashMap, TreeMap a LinkedHashMap - ktoré uchovávajú páry kľúč / hodnota. Mapy síce nie sú technicky kolekcie, ale sú plne integrované do kolekcií. Mapy sa v skutočnosti zameriavajú na skupiny asociácie medzi objektmi. Tento článok sumarizuje kľúčové rozdiely medzi HashMap a HashSet.
HashMap je najbežnejšie používanou implementáciou rozhrania mapy, ktoré poskytuje základnú mapu kľúč / hodnota, kde sú prvky neusporiadané. Používa špeciálnu hodnotu nazývanú hash kód namiesto pomalého vyhľadávania kľúča. Hash kód je spôsob, ako zobrať informácie o predmetnom objekte a zmeniť ho na „relatívne jedinečný“ int pre tento objekt. Jednoducho pracuje na princípe hashovania, čo znamená, že používa hashovaciu funkciu na mapovanie identifikačných hodnôt. Rovnako ako Vector a Stack majú svoje náhrady v ArrayList a LinkedList, Hashtable má náhradu v HashMap. Rozširuje AbstractMap na implementáciu mapového rozhrania pomocou internej reprezentácie Hashtable. A podobne ako iné všeobecné použitia, HashMap podporuje voliteľné metódy mapy, umožňuje nulové hodnoty a nie je synchronizovaný.
HashSet je jedným z členov Java Collections Framework, ktorý implementuje rozhranie Set, podporované hashovacou tabuľkou, ktorá je v skutočnosti inštanciou HashMap. Ako už názov napovedá, implementuje sa hashova tabuľka, pole, v ktorom sú prvky uložené na pozícii odvodenej od ich obsahu. Na rozdiel od mapy je sada presne kolekcia s rovnakým rozhraním, takže neexistujú žiadne ďalšie funkcie, ako je tomu v prípade dvoch rôznych zoznamov. HashSet používa hashovaciu funkciu, ktorá je navrhnutá špeciálne pre rýchle vyhľadávanie. Je to neusporiadaná kolekcia jedinečných objektov, ktoré nemôžu ukladať duplicitné hodnoty. HashSet rozširuje triedu AbstractSet, ktorá implementuje rozhranie Set. HashSet však nedefinuje žiadne ďalšie metódy okrem tých, ktoré poskytujú jeho nadtriedy a rozhrania.
HashMap je najbežnejšie používanou implementáciou rozhrania mapy, ktoré poskytuje základnú mapu kľúč / hodnota, kde sú prvky neusporiadané. Jednoducho pracuje na princípe hashovania, čo znamená, že používa hashovaciu funkciu na mapovanie identifikačných hodnôt. HashSet, na druhej strane, je jedným z členov Java Collections Framework, ktorý implementuje rozhranie Set, podporované hashovacou tabuľkou, ktorá je v skutočnosti inštanciou HashMap. Jednoducho povedané, HashMap implementuje rozhranie Map, zatiaľ čo HashSet implementuje rozhranie Set.
HashSet vytvára kolekciu, ktorá používa na uloženie hashovú tabuľku. Hash tabuľka ukladá informácie pomocou metódy nazývanej hashovanie. HashSet používa funkciu hashovania, ktorá je špeciálne navrhnutá na rýchle vyhľadávanie, na ukladanie prvkov alebo hodnôt. Väčšina funkcií HashSet sa poskytuje prostredníctvom nadtriedy AbstractCollection a AbstractSet, ktoré HashSet zdieľa so TreeSet. HashMap rozširuje AbstractMap na implementáciu rozhrania mapy pomocou internej reprezentácie Hashtable. Obe triedy nie sú synchronizované, čo znamená, že nie sú vhodné na operácie spojené s vláknami.
Pretože mapa nepodporuje duplicitné kľúče, HashMap nepovoľuje duplicitné kľúče, ale môže mať duplicitné hodnoty. To znamená, že v HashMap môžu existovať duplicitné hodnoty, ale môžete použiť kolekciu ako hodnotu proti niektorému kľúču. Každý kľúč musí byť v HashMap jedinečný a jeden kľúč nesmie mať viac ako 1 hodnotu. HashSet, na druhej strane, nemôže mať duplicitné prvky iba pomocou definície sady, čo znamená, že nemôžete ukladať duplicitné hodnoty do HashSet. HashMap povoľuje iba jeden nulový kľúč, ale umožňuje ľubovoľný počet nulových hodnôt, zatiaľ čo HashSet povoľuje iba jednu nulovú hodnotu.
HashMap pracuje na princípe hashovania, čo znamená, že používa hash funkciu na mapovanie identifikačných hodnôt interne pomocou hashovacieho algoritmu, ktorý umožňuje ľahké vyhľadávanie. Mechanizmus skutočného hashovania vždy vráti rovnaký hashCode (), keď sa použije na rovnaký objekt. Na druhej strane HashSet interne používa HashMap ako podpornú dátovú štruktúru na pridávanie alebo ukladanie objektov. To znamená, že keď sa vytvorí objekt HashSet, vytvorí sa objekt HashMap.
Aj keď HashMap a HashSet nie sú synchronizované, čo znamená, že nie sú vhodné pre operácie s bezpečnosťou vlákien, sú úplne odlišné konštrukcie, poskytujú konštantný časový výkon pre základné operácie, ako je pridávanie, odstraňovanie prvkov atď. Zatiaľ čo HashMap je implementácia na všeobecné účely rozhranie mapy, v ktorom sú uložené páry kľúč / hodnota, je HashSet implementáciou rozhrania Set. HashSet používa HashMap na podporu svojej implementácie. HashMap však používa hashovací princíp a používa ho na rýchle honenie za kľúčom.