Wanneer u een nieuwe computertaal leert, is een van de eerste dingen die u meestal vraagt, hoe u met grote groepen gegevens kunt werken. Dit onderwerp wordt vaak behandeld onder het onderwerp "Gegevensstructuren". Als je dieper graaft, moet je onderwerpen als gelinkte lijsten, wachtrijen, stapels en binaire bomen uit vele andere datastructuren halen. In Java maken deze structuren deel uit van het Java Collections Framework. Een verzameling is niets anders dan een type gegevensstructuur die verwijst naar een groepering van meerdere gegevenselementen en het Java Collections Framework standaardiseert de manier waarop deze groepen objecten worden verwerkt. In feite was het kader voor collecties ontworpen om aan verschillende doelen te voldoen.
Het volledige kader voor collecties is gebaseerd op een reeks standaardinterfaces. Verschillende standaardimplementaties zoals LinkedList, HashSet en TreeSet worden door deze interfaces geboden, zoals u dat zou kunnen. Bovendien kunt u uw eigen verzameling desgewenst implementeren. Naast verzamelingen definieert het raamwerk echter verschillende kaartinterfaces en klassen. Java bevat drie kaartimplementaties voor algemene doeleinden - HashMap, TreeMap en LinkedHashMap - die sleutel- / waardeparen opslaan. Hoewel kaarten geen technisch verzamelingen zijn, zijn ze volledig geïntegreerd met collecties. In feite richten kaarten zich op groepen associaties tussen objecten. Dit artikel vat de belangrijkste verschillen tussen HashMap en HashSet samen.
HashMap is de meest gebruikte implementatie van de kaartinterface, die een basissleutel / waardekaart biedt waarin de elementen niet zijn geordend. Het gebruikt een speciale waarde, een hash-code, in plaats van een langzame zoekactie naar de sleutel. De hash-code is een manier om informatie in het object in kwestie te nemen en het in een "relatief unieke" int voor dat object te veranderen. Het werkt gewoon volgens het hashing-principe, wat betekent dat het een hashfunctie gebruikt om identificerende waarden in kaart te brengen. Net zoals Vector en Stack hun vervangingen in ArrayList en LinkedList hebben, heeft Hashtable een vervanging in HashMap. Het breidt AbstractMap uit om de kaartinterface te implementeren met behulp van een interne Hashtable-weergave. En vergelijkbaar met andere algemene implementaties, ondersteunt HashMap de optionele methoden van Map, staat nulwaarden toe en is niet gesynchroniseerd.
HashSet is een van de leden van het Java Collections Framework dat de Set-interface implementeert, ondersteund door een hash-tabel die in feite een HashMap-instantie is. Zoals de naam al aangeeft, wordt deze geïmplementeerd door een hash-tabel, een array waarin elementen worden opgeslagen op een positie die is afgeleid van de inhoud. In tegenstelling tot een kaart is set precies een verzameling met exact dezelfde interface, dus er is geen extra functionaliteit zoals bij twee verschillende lijsten. HashSet maakt gebruik van een hash-functie die speciaal is ontworpen voor snelle opzoekingen. Het is een ongeordende verzameling unieke objecten die geen dubbele waarden kunnen opslaan. HashSet breidt de klasse AbstractSet uit die Set-interface implementeert. HashSet definieert echter geen andere methoden dan die van de superklassen en interfaces.
HashMap is de meest gebruikte implementatie van de kaartinterface, die een basissleutel / waardekaart biedt waarin de elementen niet zijn geordend. Het werkt gewoon volgens het hashing-principe, wat betekent dat het een hashfunctie gebruikt om identificerende waarden in kaart te brengen. HashSet, aan de andere kant, is een van de leden van het Java Collections Framework dat de Set-interface implementeert, ondersteund door een hash-tabel die in feite een HashMap-instantie is. Eenvoudig gezegd implementeert HashMap de interface van Map, terwijl HashSet de Set-interface implementeert.
HashSet maakt een verzameling die een hashtabel gebruikt voor opslag. Hash-tabel slaat informatie op met behulp van een methode die hashing wordt genoemd. HashSet gebruikt een hash-functie, die speciaal is ontworpen voor snelle opzoekingen, om elementen of waarden op te slaan. De meeste HashSet-functionaliteit wordt geboden door de superklasse AbstractCollection en AbstractSet, die HashSet deelt met TreeSet. HashMap breidt AbstractMap uit om de kaartinterface te implementeren met behulp van een interne Hashtable-weergave. Beide klassen zijn niet gesynchroniseerd, wat betekent dat ze niet geschikt zijn voor threadveilige bewerkingen.
Omdat Map geen dubbele sleutels ondersteunt, staat HashMap geen dubbele sleutels toe, maar mogen er dubbele waarden zijn. Dit betekent dat er dubbele waarden kunnen bestaan in HashMap, maar u kunt verzameling als waarde gebruiken voor een of andere sleutel. Elke sleutel moet uniek zijn in een HashMap en een enkele sleutel mag niet meer dan 1 waarde hebben. HashSet kan aan de andere kant geen dubbele elementen hebben door de simpele definitie van een set, wat betekent dat u geen dubbele waarden in HashSet kunt opslaan. HashMap staat slechts één nul-sleutel toe maar staat een willekeurig aantal null-waarden toe, terwijl HashSet slechts één nulwaarde toestaat.
HashMap werkt volgens het hashing-principe, wat betekent dat het een hash-functie gebruikt om intern identificerende waarden in kaart te brengen met behulp van het hash-algoritme om eenvoudig ophalen mogelijk te maken. Een echt hashing-mechanisme retourneert altijd dezelfde hashCode () wanneer deze wordt toegepast op hetzelfde object. HashSet daarentegen gebruikt HashMap intern als achtergrondstructuur voor het toevoegen of opslaan van objecten. Dit betekent dat wanneer een object van HashSet wordt gemaakt, het een object van HashMap zal maken.
Hoewel zowel HashMap als HashSet niet zijn gesynchroniseerd, wat betekent dat ze niet geschikt zijn voor threadveilige bewerkingen en het zijn volledig verschillende constructies, bieden ze constante tijdprestaties voor basishandelingen zoals toevoegen, verwijderen van elementen enz. Terwijl HashMap een implementatie voor algemene doeleinden is van de Map-interface met sleutel- / waardeparen, HashSet is een implementatie van de Set-interface. Een HashSet gebruikt wel een HashMap om de implementatie te ondersteunen. Een HashMap maakt echter gebruik van het hashing-principe en gebruikt het om snel naar de sleutel te zoeken.