Razlike između HashMap-a i Hashtable-a

1. Pregled

U ovom kratkom vodiču usredotočit ćemo se na osnovne razlike između Hashtable i HashMap.

2. Hashtable i HashMap na Javi

Hashtable i HashMap prilično su slične - obje su zbirke koje implementiraju Karta sučelje.

Također, staviti(), dobiti(), ukloniti(), i containsKey () metode pružaju konstantne performanse O (1). Interno se ove metode temelje na općenitom konceptu raspršivanja pomoću segmenata za pohranu podataka.

Niti jedna klasa ne održava redoslijed umetanja elemenata. Drugim riječima, prva dodana stavka možda nije prva stavka kada prelazimo preko vrijednosti.

Ali oni također imaju neke razlike koje u nekim situacijama čine jednu bolju od druge. Pogledajmo bliže ove razlike.

3. Razlike između Hashtable i HashMap

3.1. Sinkronizacija

Prvo, Hashtable zaštićen je nitima i mogu se dijeliti između više niti u aplikaciji.

S druge strane, HashMap nije sinkroniziran i ne može mu se pristupiti s više niti bez dodatnog koda za sinkronizaciju. Možemo koristiti Collections.synchronizedMap () za izradu verzije a HashMap. Također možemo samo stvoriti prilagođeni kôd za zaključavanje ili ga učiniti zaštićenim od niti pomoću sinkronizirano ključna riječ.

HashMap nije sinkroniziran, stoga je brži i koristi manje memorije od Hashtable. Općenito su nesinkronizirani objekti brži od sinkroniziranih u aplikaciji s jednim navojem.

3.2. Nulti vrijednosti

Druga razlika je null rukovanje. HashMap omogućuje dodavanje jednog Ulazak s null kao ključ kao i mnogi unosi sa null kao vrijednost. U kontrastu, Hashtable ne dopušta null uopće. Pogledajmo primjer null i HashMap:

Karta HashMap = nova HashMap (); map.put (null, "value"); map.put ("key1", null); map.put ("key2", null);

To će rezultirati:

assertEquals (3, map.size ());

Dalje, pogledajmo kako se Hashtable razlikuje:

Tablica tablice = nova tablica tablice (); table.put ("ključ", null);

To rezultira a NullPointerException. Dodavanje objekta pomoću null kao ključ također rezultira a NullPointerException:

table.put (null, "value");

3.3. Iteracija nad elementima

HashMap koristi Iterator iterirati preko vrijednosti, dok Hashtable ima Popisivač za isto. The Iterator je nasljednik Popisivač to otklanja nekoliko nedostataka. Na primjer, Iterator ima ukloniti() metoda za uklanjanje elemenata iz temeljnih zbirki.

The Iterator je ubrzani iterator. Drugim riječima, baca a ConcurrentModificationException kada se temeljna zbirka modificira tijekom ponavljanja. Pogledajmo primjer brzog neuspjeha:

Karta HashMap = nova HashMap (); map.put ("key1", "value1"); map.put ("key2", "value2"); Iterator iterator = map.keySet (). Iterator (); while (iterator.hasNext ()) {iterator.next (); map.put ("key4", "value4"); }

Ovo baca a ConcurrentModificationException iznimka jer zovemo staviti() dok se ponavlja kroz zbirku.

4. Kada odabrati HashMap Nad Hashtable

Trebali bismo koristiti HashMap za nesinkroniziranu ili jednostruku aplikaciju.

Vrijedno je spomenuti da od JDK 1.8, Hashtable je zastarjelo. Međutim, ConcurrentHashMap je sjajno Hashtable zamjena. Trebali bismo razmotriti ConcurrentHashMap za upotrebu u aplikacijama s više niti.

5. Zaključak

U ovom smo članku ilustrirali razlike između HashMap i Hashtable i što imati na umu kad ga trebamo odabrati.

Kao i obično, implementacija svih ovih primjera i isječaka koda završena je na Githubu.