Verschillen tussen HashMap en Hashtable

1. Overzicht

In deze korte tutorial gaan we ons concentreren op de belangrijkste verschillen tussen de Hashtable en de Hash kaart.

2. Hashtable en Hash kaart in Java

Hashtable en Hash kaart lijken veel op elkaar - beide zijn verzamelingen die het Kaart koppel.

Ook de leggen(), krijgen(), verwijderen(), en bevatKey () methoden bieden constante tijdprestaties O (1). Intern werken deze methoden op basis van een algemeen concept van hashing met behulp van buckets voor het opslaan van gegevens.

Geen van beide klassen handhaaft de invoegvolgorde van de elementen. Met andere woorden, het eerste item dat wordt toegevoegd, is mogelijk niet het eerste item wanneer we de waarden herhalen.

Maar ze hebben ook enkele verschillen die de een in sommige situaties beter maken dan de ander. Laten we deze verschillen nader bekijken.

3. Verschillen tussen Hashtable en Hash kaart

3.1. Synchronisatie

Ten eerste, Hashtable is draadveilig en kan worden gedeeld tussen meerdere threads in de applicatie.

Aan de andere kant, Hash kaart is niet gesynchroniseerd en is niet toegankelijk voor meerdere threads zonder aanvullende synchronisatiecode. We kunnen gebruiken Collections.synchronizedMap () om een ‚Äč‚Äčthreadveilige versie van een Hash kaart. We kunnen ook gewoon een aangepaste vergrendelingscode maken of de code thread-safe maken door de gesynchroniseerd trefwoord.

Hash kaart is niet gesynchroniseerd, daarom is het sneller en gebruikt het minder geheugen dan Hashtable. Over het algemeen zijn niet-gesynchroniseerde objecten sneller dan gesynchroniseerde objecten in een applicatie met één thread.

3.2. Null-waarden

Een ander verschil is nul behandeling. Hash kaart maakt het mogelijk om er een toe te voegen Binnenkomst met nul als sleutel evenals vele vermeldingen met nul als waarde. In tegenstelling tot, Hashtable staat niet toe nul helemaal. Laten we een voorbeeld bekijken van nul en Hash kaart:

HashMap-kaart = nieuwe HashMap (); map.put (null, "waarde"); map.put ("key1", null); map.put ("key2", null);

Dit resulteert in:

assertEquals (3, map.size ());

Laten we vervolgens kijken hoe Hashtable anders is:

Hashtable table = nieuwe Hashtable (); table.put ("key", null);

Dit resulteert in een NullPointerException. Een object toevoegen met nul als sleutel resulteert ook in een NullPointerException:

table.put (null, "waarde");

3.3. Iteratie over elementen

Hash kaart toepassingen Iterator om waarden te herhalen, terwijl Hashtable heeft Enumerator voor het zelfde. De Iterator is een opvolger van Enumerator dat elimineert de weinige nadelen. Bijvoorbeeld, Iterator heeft een verwijderen() methode om elementen uit onderliggende collecties te verwijderen.

De Iterator is een snelle iterator. Met andere woorden, het gooit een ConcurrentModificationException wanneer de onderliggende verzameling wordt gewijzigd tijdens het itereren. Laten we eens kijken naar het voorbeeld van fail-fast:

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

Dit gooit een ConcurrentModificationException uitzondering omdat we bellen leggen() terwijl ze de verzameling herhalen.

4. Wanneer te kiezen Hash kaart Over Hashtable

We zouden moeten gebruiken Hash kaart voor een niet-gesynchroniseerde of single thread-applicatie.

Het is vermeldenswaard dat sinds JDK 1.8, Hashtable is verouderd. Echter, ConcurrentHashMap is geweldig Hashtable vervanging. We moeten overwegen ConcurrentHashMap te gebruiken in applicaties met meerdere threads.

5. Conclusie

In dit artikel hebben we de verschillen tussen Hash kaart en Hashtable en waar we op moeten letten als we er een moeten kiezen.

Zoals gewoonlijk is de implementatie van al deze voorbeelden en codefragmenten voltooid op Github.