Forskelle mellem HashMap og Hashtable

1. Oversigt

I denne korte vejledning vil vi fokusere på kerneforskellene mellem Hashtable og HashMap.

2. Hashtable og HashMap i Java

Hashtable og HashMap er meget ens - begge er samlinger, der implementerer Kort interface.

Også den sætte(), få(), fjerne()og indeholderKey () metoder tilvejebringer konstant-tids ydelse O (1). Internt fungerer disse metoder baseret på et generelt koncept om hashing ved hjælp af spande til lagring af data.

Ingen af ​​klasserne opretholder elementernes indsætningsrækkefølge. Med andre ord, det første tilføjede element er muligvis ikke det første element, når vi gentager værdierne.

Men de har også nogle forskelle, der gør en bedre end en anden i nogle situationer. Lad os se nærmere på disse forskelle.

3. Forskelle mellem Hashtable og HashMap

3.1. Synkronisering

For det første, Hashtable er trådsikker og kan deles mellem flere tråde i applikationen.

På den anden side, HashMap er ikke synkroniseret og kan ikke tilgås af flere tråde uden yderligere synkroniseringskode. Vi kan bruge Collections.synchronizedMap () at lave en trådsikker version af en HashMap. Vi kan også bare oprette brugerdefineret låsekode eller gøre koden trådsikker ved hjælp af synkroniseret nøgleord.

HashMap er ikke synkroniseret, derfor er den hurtigere og bruger mindre hukommelse end Hashtable. Usynkroniserede objekter er generelt hurtigere end synkroniserede i en enkelt gevindapplikation.

3.2. Nulværdier

En anden forskel er nul håndtering. HashMap tillader tilføjelse af en Indgang med nul som nøgle såvel som mange poster med nul som værdi. I modsætning, Hashtable tillader ikke nul overhovedet. Lad os se et eksempel på nul og HashMap:

HashMap-kort = nyt HashMap (); map.put (null, "værdi"); map.put ("key1", null); map.put ("key2", null);

Dette vil resultere i:

assertEquals (3, map.size ());

Lad os derefter se, hvordan Hashtable er anderledes:

Hashtable-tabel = ny Hashtable (); table.put ("nøgle", null);

Dette resulterer i en NullPointerException. Tilføjelse af et objekt med nul som en nøgle resulterer også i en NullPointerException:

table.put (null, "værdi");

3.3. Iteration over elementer

HashMap anvendelser Iterator at gentage værdier, hvorimod Hashtable har Tæller for det samme. Det Iterator er en efterfølger af Tæller det eliminerer de få ulemper. For eksempel, Iterator har en fjerne() metode til at fjerne elementer fra underliggende samlinger.

Det Iterator er en fail-hurtig iterator. Med andre ord kaster det en ConcurrentModificationException når den underliggende samling ændres under iterering. Lad os se eksemplet på fail-fast:

HashMap-kort = nyt HashMap (); map.put ("nøgle1", "værdi1"); map.put ("key2", "value2"); Iterator iterator = map.keySet (). Iterator (); mens (iterator.hasNext ()) {iterator.next (); map.put ("key4", "value4"); }

Dette kaster en ConcurrentModificationException undtagelse, fordi vi ringer sætte() mens det gentager sig over samlingen.

4. Hvornår skal man vælge HashMap Over Hashtable

Vi burde bruge HashMap til et usynkroniseret eller enkelt gevind applikation.

Det er værd at nævne, at siden JDK 1.8, Hashtable er udfaset. Imidlertid, ConcurrentHashMap er en stor Hashtable udskiftning. Vi bør overveje ConcurrentHashMap til brug i applikationer med flere tråde.

5. Konklusion

I denne artikel illustrerede vi forskelle mellem HashMap og Hashtable og hvad man skal huske på, når vi skal vælge en.

Som sædvanlig er implementeringen af ​​alle disse eksempler og kodestykker afsluttet på Github.