Vraag Verschillen tussen HashMap en Hashtable?


Wat zijn de verschillen tussen een HashMap en een Hashtable in Java?

Wat is efficiënter voor applicaties zonder schroefdraad?


3113
2017-09-02 20:12


oorsprong


antwoorden:


Er zijn verschillende verschillen tussen HashMap en Hashtable in Java:

  1. Hashtable is gesynchroniseerd, terwijl HashMap is niet. Dit maakt HashMap beter voor toepassingen zonder schroefdraad, zoals niet-gesynchroniseerde objecten presteren doorgaans beter dan gesynchroniseerde.

  2. Hashtable staat niet toe null toetsen of waarden. HashMap staat een toe null sleutel en een willekeurig aantal null waarden.

  3. Een van de subklassen van HashMap is LinkedHashMap, dus in het geval dat u een voorspelbare iteratieorder wilt (dit is standaard invoegvolgorde), kunt u eenvoudig de HashMap voor een LinkedHashMap. Dit zou niet zo gemakkelijk zijn als je gebruikt Hashtable.

Aangezien synchronisatie geen probleem voor u is, zou ik aanbevelen HashMap. Als synchronisatie een probleem wordt, kunt u ook naar kijken ConcurrentHashMap.


3203
2017-09-02 23:02



Merk op dat veel van de antwoorden aangeven dat hashtable gesynchroniseerd is. In de praktijk koopt dit je heel weinig.  De synchronisatie vindt plaats op de accessor / mutatormethoden waardoor twee threads gelijktijdig worden toegevoegd aan of verwijderd van de kaart, maar in de echte wereld zult u vaak aanvullende synchronisatie nodig hebben.

Een heel gebruikelijk idioom is 'controleren en plaatsen' - dat wil zeggen, zoek naar een item in de kaart en voeg het toe als het nog niet bestaat. Dit is geen enkele atomaire operatie, of je nu Hashtable of HashMap gebruikt.

Een equivalente gesynchroniseerde HashMap kan worden verkregen door:

Collections.synchronizedMap(myMap);

Maar om deze logica correct te implementeren, hebt u dit nodig extra synchronisatie van de vorm:

synchronized(myMap) {
    if (!myMap.containsKey("tomato"))
        myMap.put("tomato", "red");
}

Zelfs itereren over de invoer van een hash-tabel (of een hash-kaart verkregen door Collections.synchronizedMap) is niet thread-safe, tenzij je ook bewaakt dat de kaart door aanvullende synchronisatie wordt gewijzigd.

Implementaties van de ConcurrentMap interface (bijvoorbeeld ConcurrentHashMap) Los een deel hiervan op met opnemen thread veilige 'check-then-act'-semantiek zoals:

ConcurrentMap.putIfAbsent(key, value);

580
2017-09-03 11:00



Niemand heeft het feit genoemd dat Hashtable is niet onderdeel van het Java Collections Framework - het biedt gewoon een vergelijkbare API. Ook, Hashtable wordt beschouwd als oude code. Daar gaat niets over Hashtable dat kan niet gedaan worden met HashMap of afleidingen van HashMap, dus voor nieuwe code zie ik geen enkele reden om hiernaar terug te gaan Hashtable.


287
2018-06-25 01:46



Deze vraag wordt vaak in een interview gesteld om na te gaan of de kandidaat het juiste gebruik van collectieklassen begrijpt en is op de hoogte van beschikbare alternatieve oplossingen.

  1. De klasse HashMap is ongeveer gelijk aan Hashtable, behalve dat deze niet-gesynchroniseerd is en nulls toestaat. (HashMap staat nulwaarden toe als sleutel en waarde, terwijl Hashtable nulls niet toestaat).
  2. HashMap garandeert niet dat de volgorde van de kaart in de loop van de tijd constant zal blijven.
  3. HashMap is niet-gesynchroniseerd, terwijl Hashtable is gesynchroniseerd.
  4. Iterator in de HashMap is fail-safe terwijl de enumerator voor de hash-tabel dat niet is en werpt ConcurrentModificationException als een andere thread de kaart structureel wijzigt door elementen toe te voegen of te verwijderen behalve de eigen remove () -methode van Iterator. Maar dit is geen gegarandeerd gedrag en zal door JVM op zijn best worden gedaan.

Opmerking over enkele belangrijke voorwaarden

  1. Gesynchroniseerd betekent dat slechts één thread op een bepaald moment een hash-tabel kan wijzigen. Kort gezegd betekent dit dat elke thread voordat een update op een hashtable wordt uitgevoerd een vergrendeling van het object moet krijgen terwijl anderen zullen wachten totdat de vergrendeling is vrijgegeven.
  2. Fail-safe is relevant vanuit de context van iterators. Als een iterator is gemaakt op een collectieobject en een andere thread probeert het verzamelingsobject "structureel" te wijzigen, wordt een uitzondering voor een gelijktijdige wijziging gegenereerd. Het is echter mogelijk voor andere threads om de "set" -methode aan te roepen, omdat het de verzameling niet "structureel" wijzigt. Echter, als voorafgaand aan het aanroepen van "set", de verzameling structureel is aangepast, zal "IllegalArgumentException" worden gegenereerd.
  3. Structureel modificeren betekent het verwijderen of invoegen van een element dat de structuur van de kaart effectief zou kunnen veranderen.

HashMap kan worden gesynchroniseerd met

Map m = Collections.synchronizeMap(hashMap);

Kaart biedt verzamelweergaven in plaats van directe ondersteuning voor iteratie  via Enumeration-objecten. Collectieweergaven verbeteren de  expressiviteit van de interface, zoals later in deze sectie wordt besproken.  Met Map kunt u sleutels, waarden of sleutel / waardeparen herhalen.  Hashtable biedt niet de derde optie. Kaart biedt een veilige manier  om items te verwijderen in het midden van iteratie; Hashtable niet.  Ten slotte lost de kaart een klein tekort op in de hashtabelinterface.  Hashtable heeft een methode genaamd contains, die true retourneert als de  Hashtable bevat een bepaalde waarde. Gezien de naam zou je dit verwachten  methode om true terug te geven als de hashtabel een gegeven sleutel bevat, omdat  de sleutel is het primaire toegangsmechanisme voor een hashtabel. De kaart  interface elimineert deze bron van verwarring door de methode te hernoemen  containsValue. Dit verbetert ook de consistentie van de interface -  containsValue parallels containsKey.

De kaartinterface


148
2017-10-04 06:39



HashMap: Een implementatie van de Map interface die hash-codes gebruikt om een ​​array te indexeren. Hashtable: Hallo, 1998 genoemd. Ze willen hun collecties API terug.

Maar serieus is het beter om weg te blijven Hashtable allemaal samen. Voor apps met één thread heb je de extra overhead van synchronisatie niet nodig. Voor zeer concurrente apps kan de paranoïde synchronisatie leiden tot uithongering, deadlocks of onnodige afvalverzamelpauzes. Zoals Tim Howland al zei, zou je kunnen gebruiken ConcurrentHashMap in plaats daarvan.


107
2017-09-02 23:14



Onthoud dat HashTable was een oudere klasse voordat Java Collections Framework (JCF) werd geïntroduceerd en later werd aangepast om het Map interface. Zo was Vector en Stack.

Blijf daarom altijd weg van hen in een nieuwe code omdat er altijd een beter alternatief is in de JCFzoals anderen hadden opgemerkt.

Hier is de Java-verzameling spiekbriefje die je handig vindt. Let op: het grijze blok bevat de oude klasse HashTable, Vector en Stack.

enter image description here


104
2018-03-25 08:58



In aanvulling op wat izb zei, HashMap staat nulwaarden toe, terwijl de Hashtable doet niet.

Merk ook op dat Hashtable breidt het uit Dictionary klasse, die als de javadocs staat, is verouderd en is vervangen door de Map interface.


58
2017-09-02 20:30



Bekijk deze grafiek. Het biedt vergelijkingen tussen verschillende datastructuren samen met HashMap en Hashtable. De vergelijking is nauwkeurig, duidelijk en gemakkelijk te begrijpen.

Java-verzamelingsmatrix


50
2017-11-20 05:35



Hashtable is vergelijkbaar met de HashMap en heeft een vergelijkbare interface. Het wordt aanbevolen dat u gebruikt HashMap, tenzij u ondersteuning voor oudere applicaties nodig heeft of als u synchronisatie nodig hebt, zoals de Hashtables methoden zijn gesynchroniseerd. Dus in jouw geval, omdat je niet multi-threading bent, HashMaps zijn je beste gok.


39
2017-09-02 20:25