Když se naučíte nový počítačový jazyk, jednou z prvních věcí, kterou se obvykle ptáte, je, jak pracovat s velkými skupinami dat. Toto téma je často zahrnuto v tématu „Datové struktury“. Pokud hloubíte hlouběji, musíte mezi mnoha dalšími datovými strukturami obejít témata jako propojené seznamy, fronty, hromádky a binární stromy. V Javě jsou tyto struktury součástí Java Collection Framework. Kolekce není ničím jiným než typem datové struktury, která odkazuje na seskupení více datových prvků a Java Collection Framework standardizuje způsob, jakým se s těmito skupinami objektů zachází. Rámec sbírek byl ve skutečnosti navržen tak, aby splňoval několik cílů.
Celý rámec kolekcí je navržen na základě sady standardních rozhraní. Několik standardních implementací, jako je LinkedList, HashSet a TreeSet, poskytuje tato rozhraní, která můžete, jak jsou. Kromě toho můžete také implementovat svou vlastní kolekci, pokud se rozhodnete. Kromě kolekcí však rámec definuje několik mapových rozhraní a tříd. Java obsahuje tři obecné mapové implementace - HashMap, TreeMap a LinkedHashMap - které ukládají páry klíč / hodnota. Přestože mapy nejsou technicky sbírky, jsou plně integrovány do sbírek. Mapy se ve skutečnosti zaměřují na skupiny asociace mezi objekty. Tento článek shrnuje klíčové rozdíly mezi HashMap a HashSet.
HashMap je nejčastěji používanou implementací rozhraní Map, které poskytuje základní mapu klíčů a hodnot, kde jsou prvky neuspořádané. Místo pomalého vyhledávání klíče používá speciální hodnotu nazvanou hash kód. Hašovací kód je způsob, jak vzít informace v předmětném objektu a proměnit jej v „relativně jedinečný“ int pro tento objekt. Jednoduše pracuje na principu hašování, což znamená, že používá hashovací funkci k mapování identifikačních hodnot. Stejně jako nahrazení Vector a Stack v ArrayList a LinkedList, Hashtable má náhradu v HashMap. Rozšiřuje AbstractMap pro implementaci rozhraní Map pomocí interní reprezentace Hashtable. A podobně jako u jiných obecných implementací podporuje HashMap volitelné metody Map, umožňuje nulové hodnoty a není synchronizován.
HashSet je jedním z členů Java Collections Framework, který implementuje rozhraní Set, podporované hashovou tabulkou, která je ve skutečnosti instancí HashMap. Jak název napovídá, je implementován hashovou tabulkou, maticí, ve které jsou prvky uloženy v poloze odvozené od jejich obsahu. Na rozdíl od mapy je sada přesně kolekcí se stejným rozhraním, takže neexistuje žádná další funkce, jako je tomu u dvou různých seznamů. HashSet používá hashovací funkci, která je navržena speciálně pro rychlé vyhledávání. Je to neuspořádaná kolekce jedinečných objektů, které nemohou ukládat duplicitní hodnoty. HashSet rozšiřuje třídu AbstractSet, která implementuje rozhraní Set. HashSet však nedefinuje žádné další metody kromě těch, které poskytují jeho nadtřídy a rozhraní.
HashMap je nejčastěji používanou implementací rozhraní Map, které poskytuje základní mapu klíčů a hodnot, kde jsou prvky neuspořádané. Jednoduše pracuje na principu hašování, což znamená, že používá hashovací funkci k mapování identifikačních hodnot. HashSet, na druhé straně, je jedním z členů Java Collections Framework, který implementuje rozhraní Set, podporované hashovou tabulkou, která je ve skutečnosti instancí HashMap. Jednoduše řečeno, HashMap implementuje rozhraní Map, zatímco HashSet implementuje rozhraní Set.
HashSet vytvoří kolekci, která pro ukládání používá tabulku hash. Hash tabulka ukládá informace pomocí metody zvané hashování. HashSet používá hashovací funkci, která je speciálně navržena pro rychlé vyhledávání, k ukládání prvků nebo hodnot. Většina funkcí HashSet je poskytována prostřednictvím nadřazené třídy AbstractCollection a AbstractSet, které HashSet sdílí s TreeSet. HashMap rozšiřuje AbstractMap o implementaci rozhraní Map pomocí interní reprezentace Hashtable. Obě třídy nejsou synchronizovány, což znamená, že nejsou vhodné pro operace s podprocesy.
Protože mapa nepodporuje duplicitní klíče, HashMap nepovoluje duplicitní klíče, ale může mít duplicitní hodnoty. To znamená, že v HashMapu mohou existovat duplicitní hodnoty, ale můžete použít kolekci jako hodnotu proti některému klíči. Každý klíč musí být v HashMapu jedinečný a jeden klíč nesmí mít více než 1 hodnotu. HashSet, na druhé straně, nemůže mít duplicitní prvky pouhou definicí sady, což znamená, že nemůžete ukládat duplicitní hodnoty v HashSet. HashMap umožňuje pouze jeden nulový klíč, ale umožňuje libovolný počet nulových hodnot, zatímco HashSet umožňuje pouze jednu nulovou hodnotu.
HashMap pracuje na hašovacím principu, což znamená, že používá hašovací funkci pro mapování identifikačních hodnot interně pomocí hašovacího algoritmu pro snadné vyhledávání. Mechanismus skutečného hašování vždy vrátí stejný hashCode (), když se použije na stejný objekt. Na druhou stranu HashSet interně používá HashMap jako podkladovou datovou strukturu pro přidávání nebo ukládání objektů. To znamená, že když je vytvořen objekt HashSet, vytvoří se objekt HashMap.
Ačkoli jak HashMap, tak HashSet nejsou synchronizovány, což znamená, že nejsou vhodné pro operace bezpečné pro podprocesy a jsou zcela odlišné konstrukce, poskytují konstantní časový výkon pro základní operace, jako je přidání, odebrání prvku atd. Zatímco HashMap je obecná implementace rozhraní Map, ve kterém jsou uloženy páry klíč / hodnota, je HashSet implementací rozhraní Set. HashSet používá HashMap k podpoře jeho implementace. HashMap však používá hashovací princip a používá jej k rychlému lovu na klíč.