Het Java Collections-framework biedt een verzameling collectieklassen. Elke klas heeft zijn eigen prestatiesterke en zwakke punten. Sommige klassen bieden volledige implementaties die kunnen worden gebruikt zoals ze zijn. Andere zijn abstract en bieden skeletimplementaties die worden gebruikt als startpunt voor het maken van verzamelingen. De verzamelingimplementaties gebruiken het gesynchroniseerde omhulselraamwerk om gesynchroniseerde klassen te verschaffen, anders zijn de implementaties niet gesynchroniseerd. Verschillende klassen bieden implementaties van de kaartinterface.
Het Java-platform bevat drie algemene Map-implementaties: HashMap, TreeMap en LinkedHashMap. HashMap en Hashtable zijn twee collecties in Java die worden gebruikt voor het opslaan van sleutel / waarde-paren in een hashtabel. Hashtable is een gesynchroniseerde kaart en HashMap is een niet-gesynchroniseerde kaart. Als u echter een gesynchroniseerde kaart wilt gebruiken, is een hashtabel sneller dan een hash-kaart in een gesynchroniseerde wikkel. Beide zijn op hash-gebaseerde collecties in Java, maar ze hebben een groot aantal verschillen. We belichten enkele belangrijke verschillen tussen de twee om u te helpen de voorwaarden beter te begrijpen.
HashMap is een kaartimplementatie op basis van een hashtabel die constante-tijdprestaties biedt voor het invoegen en lokaliseren van paren. De klasse HashMap biedt een kaartimplementatie die is gebaseerd op een hashtable gegevensstructuur. Deze implementatie ondersteunt alle Map-bewerkingen en staat meerdere nulwaarden toe, maar slechts één nul-sleutel. Het gebruikt sleutel / waarde-paren om waarden op te slaan in een hashtabel. Het is een niet-gesynchroniseerde kaart, wat betekent dat het niet thread-veilig is en niet kan worden gedeeld tussen meerdere threads zonder de juiste synchronisatie.
In tegenstelling tot HashMap is Hashtable een gesynchroniseerde kaart en het is thread-safe, wat betekent dat het gedeeld kan worden tussen meerdere threads. In Hashtable geeft u een object op dat als een sleutel kan worden gebruikt en de waarde die bij de sleutel hoort. Een hash-tabel brengt sleutels in kaart voor waarden met behulp van een hash-functie. Java biedt deze functie in de vorm van de hashcode () -methode van Object, waarbij klassen worden overschreven om geschikte hashcodes te bieden. In tegenstelling tot HashMap ondersteunt hashtable geen null-waarden en null-sleutels omdat er een nulcontrole is in de implementatie van de putmethode van hashtable.
Beide zijn hash-gebaseerde collecties in Java die worden gebruikt om gegevens op te slaan in sleutel- / waardeparen. HashMap is een kaartimplementatie op basis van een hashtabel die constante-tijdprestaties biedt voor het invoegen en lokaliseren van paren. De prestaties kunnen worden aangepast met behulp van constructors waarmee u de capaciteit en belastingsfactor van de hash-tabel kunt instellen. De basishashtable lijkt sterk op de HashMap, zelfs de methodamen. Het slaat sleutel / waarde-paar op in hash-tabel. In Hashtable geeft u een object op dat als een sleutel kan worden gebruikt en de waarde die bij de sleutel hoort.
Zowel HashMap als Hashtable gebruiken hashing-technieken om waarden op te slaan op basis van de sleutel. Net als HashMap gebruikt Hashtable sleutel / waarde-paren om waarden op te slaan in een hashtabel. Het belangrijkste verschil tussen beide is echter synchronisatie. HashMap is een niet-gesynchroniseerde kaart terwijl Hashtable een gesynchroniseerde kaart is. Dit betekent dat HashMap niet threadveilig is en niet kan worden gedeeld tussen meerdere threads zonder de juiste synchronisatiecode. Hashtable is integendeel thread-safe en kan worden gedeeld tussen meerdere threads. Hashtable is sneller dan het gebruik van een HashMap in een gesynchroniseerde wrapper, als u een gesynchroniseerde kaart moet gebruiken.
De klasse HashMap biedt een kaartimplementatie die is gebaseerd op een hashtable gegevensstructuur. Deze implementatie ondersteunt alle Map-bewerkingen en staat meerdere nulwaarden toe, maar slechts één nul-sleutel, zodat deze unieke sleuteleigenschappen kan behouden. Het geeft echter geen garanties over de volgorde waarin de boekingen zijn opgeslagen. Met de hashtabel worden toetsen aan waarden toegewezen met behulp van een hashfunctie. In tegenstelling tot HashMap ondersteunt hashtable geen null-waarden en null-sleutels omdat er een nulcontrole is in de implementatie van de putmethode van hashtable.
Omdat HashMap geen gesynchroniseerde Map is, is het veel sneller en beter dan een Hashtable op het gebied van prestaties, en in feite gebruikt het minder geheugen dan Hashtable. Hoewel ze vrijwel identiek zijn, is Hashtable een beetje langzamer dan een HashMap, maar sneller dan een gesynchroniseerde HashMap. Inherent is het niet veilig om Hashtable met multithreadtoegang te gebruiken omdat alleen de methoden worden gesynchroniseerd. Hashtable is de gesynchroniseerde tegenhanger van HashMap. Niet-gesynchroniseerde objecten presteren beter in vergelijking met gesynchroniseerde objecten, net zoals een hashtabel beter presteert in een enkele threadomgeving.
De klasse HashMap geeft u een ongesorteerde, ongeordende kaart. Dus wanneer u een kaart nodig heeft en u zich niets aantrekt van de volgorde waarin de vermeldingen worden opgeslagen, dan is HashMap de juiste keuze.
Hashtable, net als Vector, is vanaf de prehistorische Java-tijden binnen geweest. Net zoals Vector een gesynchroniseerde tegenhanger is van de meer moderne en geavanceerde ArrayList, is Hashtable de gesynchroniseerde tegenhanger van HashMap. Een klasse kan echter niet worden gesynchroniseerd, dus als we zeggen dat hashtable een gesynchroniseerde kaart is, betekent dit dat de belangrijkste methoden van de klasse zijn gesynchroniseerd.
Hoewel beide vrijwel identiek zijn, ligt het verschil in de manier waarop ze worden gesynchroniseerd en hoe ze presteren. HashMap presteert beter in een omgeving met meerdere threads, terwijl Hashtable beter presteert in een omgeving met één thread.