Rozdiely medzi HashMap a Hashtable

1. Prehľad

V tomto krátkom tutoriáli sa zameriame na základné rozdiely medzi Hashtable a HashMap.

2. Hashtable a HashMap v Jave

Hashtable a HashMap sú si dosť podobné - obe sú kolekcie, ktoré implementujú Mapa rozhranie.

Tiež put (), dostať (), odstrániť ()a containsKey () metódy poskytujú výkon v konštantnom čase O (1). Interne tieto metódy fungujú na základe všeobecného konceptu hašovania pomocou segmentov na ukladanie údajov.

Ani jedna trieda nezachováva poradie vkladania prvkov. Inými slovami, prvá pridaná položka nemusí byť prvou položkou, keď iterujeme nad hodnotami.

Ale majú tiež určité rozdiely, vďaka ktorým je v niektorých situáciách človek lepší ako iný. Pozrime sa bližšie na tieto rozdiely.

3. Rozdiely medzi Hashtable a HashMap

3.1. Synchronizácia

Po prvé, Hashtable je bezpečný pre vlákna a môžu byť zdieľané medzi viacerými vláknami v aplikácii.

Na druhej strane, HashMap nie je synchronizovaný a nie je k nemu možné získať prístup pomocou viacerých vlákien bez dodatočného synchronizačného kódu. Môžeme použiť Collections.synchronizedMap () vytvoriť verziu vlákna HashMap. Môžeme tiež jednoducho vytvoriť vlastný zámkový kód alebo zaistiť bezpečnosť kódu pomocou vlákna synchronizované kľúčové slovo.

HashMap nie je synchronizovaný, preto je rýchlejší a využíva menej pamäte ako Hashtable. Nesynchronizované objekty sú vo všeobecnosti rýchlejšie ako synchronizované objekty v aplikácii s jedným vláknom.

3.2. Nulové hodnoty

Ďalším rozdielom je nulový manipulácia. HashMap umožňuje pridať jednu Vstup s nulový ako kľúč, ako aj veľa záznamov s nulový ako hodnota. Naproti tomu Hashtable neumožňuje nulový vôbec. Pozrime sa na príklad nulový a HashMap:

Mapa HashMap = nová HashMap (); map.put (null, "hodnota"); map.put ("key1", null); map.put ("key2", null);

Výsledkom bude:

assertEquals (3, map.size ());

Ďalej sa pozrime, v čom je Hashtable iný:

Hashtable tabuľka = nová Hashtable (); table.put ("kľúč", null);

Výsledkom je a NullPointerException. Pridanie objektu pomocou nulový ako kľúč má za následok aj a NullPointerException:

table.put (null, "hodnota");

3.3. Iterácia nad prvkami

HashMap používa Iterátor iterovať nad hodnotami, zatiaľ čo HashtableVymenovateľ za to isté. The Iterátor je nástupcom spoločnosti Vymenovateľ čo eliminuje jeho niekoľko nevýhod. Napríklad, Iterátorodstrániť () metóda na odstránenie prvkov z podkladových kolekcií.

The Iterátor je rýchly zlyhávací iterátor. Inými slovami, hádže a ConcurrentModificationException keď je podkladová kolekcia upravená počas iterácie. Pozrime sa na príklad rýchleho zlyhania:

Mapa HashMap = nová HashMap (); map.put ("kľúč1", "hodnota1"); map.put ("key2", "value2"); Iterátor iterátor = map.keySet (). Iterátor (); while (iterator.hasNext ()) {iterator.next (); map.put ("key4", "value4"); }

Toto hodí a ConcurrentModificationException výnimka, pretože voláme put () pri opakovaní zbierky.

4. Kedy zvoliť HashMap Koniec Hashtable

Mali by sme použiť HashMap pre nesynchronizovanú aplikáciu alebo aplikáciu s jedným vláknom.

Za zmienku stojí, že od JDK 1.8, Hashtable bola ukončená podpora. Avšak ConcurrentHashMap je super Hashtable výmena. Mali by sme zvážiť ConcurrentHashMap na použitie v aplikáciách s viacerými vláknami.

5. Záver

V tomto článku sme ilustrovali rozdiely medzi HashMap a Hashtable a na čo treba pamätať, keď si potrebujeme jednu zvoliť.

Implementácia všetkých týchto príkladov a útržkov kódu je ako obvykle na serveri Github ukončená.


$config[zx-auto] not found$config[zx-overlay] not found