Java >> Java tutorial >  >> Tag >> HashMap

Forskelle mellem HashMap og Hashtable

1. Oversigt

I dette korte selvstudie vil vi fokusere på de kerneforskelle mellem Hashtable og HashMap .

2. Hashtable og HashMap i Java

Hashtable og HashMap er ret ens – begge er samlinger, der implementerer kortet grænseflade.

Desuden put() , get() , remove() , og containsKey() metoder giver konstant-tidsydelse O(1). Internt fungerer disse metoder baseret på et generelt koncept med hashing ved hjælp af buckets til lagring af data.

Ingen af ​​klasserne opretholder elementernes indsættelsesrækkefølge. Med andre ord er det første element, der tilføjes, muligvis ikke det første element, når vi itererer over værdierne.

Men de har også nogle forskelle, der gør den ene bedre end den 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 et HashMap . Vi kan også bare oprette en tilpasset låsekode eller gøre koden trådsikker ved at bruge den synkroniserede søgeord.

HashMap er ikke synkroniseret, derfor er det hurtigere og bruger mindre hukommelse end Hashtable . Generelt er usynkroniserede objekter hurtigere end synkroniserede objekter i en enkelt trådet applikation.

3.2. Nul-værdier

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

HashMap<String, String> map = new HashMap<String, String>();
map.put(null, "value");
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<String, String> table = new Hashtable<String, String>();
table.put("key", null);

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

table.put(null, "value");

3.3. Iteration over elementer

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

Iteratoren er en fejl-hurtig iterator. Med andre ord, det kaster en ConcurrentModificationException når den underliggende samling ændres under iteration. Lad os se eksemplet med fail-fast:

HashMap<String, String> map = new HashMap<String, String>();
map.put("key1", "value1");
map.put("key2", "value2");

Iterator<String> iterator = map.keySet().iterator();
while(iterator.hasNext()){ 
    iterator.next();
    map.put("key4", "value4");
}

Dette kaster en ConcurrentModificationException undtagelse, fordi vi kalder put() mens du gentager samlingen.

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

Vi bør bruge HashMap for en usynkroniseret eller enkelttrådet applikation.

Det er værd at nævne, at siden JDK 1.8, Hashtable er blevet forældet. Men ConcurrentHashMap er en fantastisk 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 vi skal huske på, når vi skal vælge en.

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


Java tag