Różnica między HashMap i Hashtable

Framework Java Collections zapewnia zestaw klas kolekcji. Każda klasa ma swoje mocne i słabe strony. Niektóre klasy zapewniają pełne implementacje, których można używać bez zmian. Inne są abstrakcyjne i zapewniają szkieletowe implementacje, które są używane jako punkty wyjścia do tworzenia kolekcji. Implementacje kolekcji używają struktury synchronizowanego opakowania w celu zapewnienia zsynchronizowanych klas, w przeciwnym razie implementacje nie zostaną zsynchronizowane. Kilka klas zapewnia implementacje interfejsu mapy.

Platforma Java zawiera trzy implementacje Map ogólnego przeznaczenia: HashMap, TreeMap i LinkedHashMap. HashMap i Hashtable to dwie kolekcje w Javie używane do przechowywania par klucz / wartość w tabeli skrótów. Hashtable to zsynchronizowana mapa, a HashMap to niezsynchronizowana mapa. Niemniej jednak, jeśli chcesz użyć zsynchronizowanej mapy, zestaw Hashtable jest szybszy niż użycie zestawu HashMap w zsynchronizowanym opakowaniu. Obie są kolekcjami opartymi na haszowaniu w Javie, ale mają spory udział w różnicach. Podkreślamy niektóre kluczowe różnice między nimi, aby pomóc Ci lepiej zrozumieć warunki.

Co to jest HashMap?

HashMap to implementacja mapy oparta na tabeli skrótów, która zapewnia stałą wydajność przy wstawianiu i lokalizowaniu par. Klasa HashMap zapewnia implementację mapy opartą na strukturze danych Hashtable. Ta implementacja obsługuje wszystkie operacje na mapie i dopuszcza wiele wartości zerowych, ale tylko jeden klucz zerowy. Używa par klucz / wartość do przechowywania wartości w tabeli skrótów. Jest to niezsynchronizowana mapa, co oznacza, że ​​nie jest bezpieczna dla wątków i nie może być dzielona między wieloma wątkami bez odpowiedniej synchronizacji.

Co to jest Hashtable?

W przeciwieństwie do HashMap, Hashtable jest zsynchronizowaną mapą i jest bezpieczny dla wątków, co oznacza, że ​​można go współdzielić między wieloma wątkami. W Hashtable określasz obiekt, który może być użyty jako klucz, oraz wartość, która odpowiada kluczowi. Hashtable mapuje klucze do wartości za pomocą funkcji skrótu. Java udostępnia tę funkcję w postaci metody hashcode () Object, która zastępuje klasy w celu zapewnienia odpowiednich kodów skrótu. W przeciwieństwie do HashMap, Hashtable nie obsługuje wartości null i kluczy null, ponieważ w implementacji metody put Hashtable istnieje sprawdzanie wartości null.

Różnica między HashMap i Hashtable

  1. Podstawy HashMap vs. Hashtable

Obie są kolekcjami opartymi na haszowaniu w Javie, służącym do przechowywania danych w parach klucz / wartość. HashMap to implementacja mapy oparta na tabeli skrótów, która zapewnia stałą wydajność przy wstawianiu i lokalizowaniu par. Wydajność można dostosować za pomocą konstruktorów, które pozwalają ustawić pojemność i współczynnik obciążenia tabeli mieszającej. Podstawowy Hashtable jest dość podobny do HashMap, nawet przy nazwach metod. Przechowuje parę klucz / wartość w tablicy mieszającej. W Hashtable określasz obiekt, który może być użyty jako klucz, oraz wartość, która odpowiada kluczowi.

  1. Synchronizacja HashMap vs. Hashtable

Zarówno HashMap, jak i Hashtable używają technik mieszających do przechowywania wartości na podstawie klucza. Podobnie jak HashMap, Hashtable używa par klucz / wartość do przechowywania wartości w tabeli skrótów. Jednak kluczową różnicą między nimi jest synchronizacja. HashMap to niezsynchronizowana mapa, podczas gdy Hashtable to zsynchronizowana mapa. Oznacza to, że HashMap nie jest bezpieczny dla wątków i nie może być współużytkowany przez wiele wątków bez odpowiedniego kodu synchronizacji. Wręcz przeciwnie, Hashtable jest bezpieczny dla wątków i może być współużytkowany przez wiele wątków. Hashtable jest szybszy niż używanie HashMap w zsynchronizowanym opakowaniu, jeśli potrzebujesz użyć zsynchronizowanej mapy.

  1. Klucze zerowe i wartości zerowe dla HashMap vs. Hashtable

Klasa HashMap zapewnia implementację mapy opartą na strukturze danych Hashtable. Ta implementacja obsługuje wszystkie operacje mapy i dopuszcza wiele wartości zerowych, ale tylko jeden klucz zerowy, aby mógł zachować unikalne właściwości klucza. Nie gwarantuje to jednak kolejności, w jakiej wpisy są przechowywane. Z drugiej strony Hashtable mapuje klucze do wartości za pomocą funkcji skrótu. W przeciwieństwie do HashMap, Hashtable nie obsługuje wartości null i kluczy null, ponieważ w implementacji metody put Hashtable istnieje sprawdzanie wartości null.

  1. Wydajność HashMap vs. Hashtable

Ponieważ HashMap nie jest zsynchronizowaną mapą, jest znacznie szybszy i lepszy niż Hashtable pod względem wydajności, i w rzeczywistości zużywa mniej pamięci niż Hashtable. Chociaż są praktycznie identyczne, Hashtable jest nieco wolniejszy niż HashMap, ale szybszy niż zsynchronizowany HashMap. Zasadniczo używanie Hashtable z dostępem wielowątkowym nie jest bezpieczne, ponieważ synchronizowane są tylko metody. Hashtable jest zsynchronizowanym odpowiednikiem HashMap. Niezsynchronizowane obiekty działają lepiej w porównaniu do obiektów synchronizowanych, podobnie jak Hashtable działa lepiej w środowisku z jednym wątkiem.

HashMap vs. Hashtable: Tabela porównawcza

 

Podsumowanie Vs HashMap Hashtable

Klasa HashMap daje nieposortowaną, nieuporządkowaną mapę. Więc jeśli potrzebujesz mapy i nie obchodzi Cię kolejność przechowywania wpisów, to HashMap jest właściwą drogą.

Hashtable, podobnie jak Vector, pochodzi z prehistorycznych czasów Java. Podobnie jak Vector jest zsynchronizowanym odpowiednikiem bardziej nowoczesnej i zaawansowanej ArrayList, tak Hashtable jest zsynchronizowanym odpowiednikiem HashMap. Jednak klasy nie można zsynchronizować, więc gdy mówimy, że Hashtable jest zsynchronizowaną mapą, oznacza to, że kluczowe metody klasy są zsynchronizowane. 

Chociaż oba są praktycznie identyczne, różnica polega na sposobie ich synchronizacji i wydajności. HashMap działa lepiej w środowisku wielowątkowym, podczas gdy Hashtable działa lepiej w środowisku jednowątkowym.