HashMap i Hashtable
Struktura kolekcji Java udostępnia zestaw klas kolekcji. Każda klasa ma swoje mocne i słabe strony. Niektóre klasy zapewniają pełne implementacje, które mogą być używane tak jak jest. Inne są abstrakcyjne, które zapewniają szkieletowe implementacje, które są używane jako punkty wyjścia do tworzenia kolekcji. Implementacje kolekcji wykorzystują strukturę zsynchronizowanego wrappera do zapewniania synchronizowanych klas, w przeciwnym razie implementacje są niezsynchronizowane. Kilka klas zapewnia implementacje interfejsu mapy.
Platforma Java zawiera trzy ogólne zastosowania map: HashMap, TreeMap i LinkedHashMap. HashMap i Hashtable to dwie kolekcje w języku Java używane do przechowywania par klucz / wartość w tabeli mieszania. Hashtable to zsynchronizowana mapa, a HashMap to niezsynchronizowana mapa. Niemniej jednak, jeśli potrzebujesz użyć zsynchronizowanej mapy, Hashtable jest szybsza niż używanie HashMap w zsynchronizowanym opakowaniu. Obie są oparte na hash kolekcji w Javie, ale mają one sprawiedliwy udział w różnicach. Podkreślamy kilka kluczowych różnic między tymi dwoma, aby pomóc ci lepiej zrozumieć warunki.
Co to jest HashMap?
HashMap jest implementacją mapy opartą na tabeli mieszania, która zapewnia stałą wydajność wstawiania i lokalizowania par. Klasa HashMap udostępnia implementację mapy opartą na strukturze danych HashTable. Ta implementacja obsługuje wszystkie operacje na mapie i dopuszcza wiele wartości null, ale tylko jeden klucz zerowy. Używa par klucz / wartość do przechowywania wartości w tabeli mieszania. Jest to niezsynchronizowana mapa, co oznacza, że nie jest bezpieczna dla wątków i nie może być współdzielona między wieloma wątkami bez odpowiedniej synchronizacji.
Co to jest Hashtable?
W przeciwieństwie do HashMap, Hashtable jest zsynchronizowaną Mapą i jest bezpieczna dla wątków, co oznacza, że może być współdzielona między wieloma wątkami. W Hashtable określasz obiekt, który może być używany jako klucz i wartość, która jest zgodna z kluczem. Hashtable mapuje klucze do wartości za pomocą funkcji skrótu. Java udostępnia tę funkcję w postaci metody hashcode () obiektu, której klasy zastępują, aby zapewnić odpowiednie kody skrótów. W odróżnieniu od HashMap, Hashtable nie obsługuje wartości null i pustych kluczy, ponieważ w implementacji put metody HashTable jest zerowy.
Różnica między HashMap i HashTable
Oba to zbiory oparte na hashach w języku Java, używane do przechowywania danych w parach klucz / wartość. HashMap jest implementacją mapy opartą na tabeli mieszania, która zapewnia stałą wydajność wstawiania i lokalizowania par. Wydajność można dostosować za pomocą konstruktorów, które umożliwiają ustawienie współczynnika wydajności i obciążenia tabeli skrótów. Podstawowa HashTable jest bardzo podobna do HashMap, nawet w dół nazwy metod. Przechowuje parę klucz / wartość w tabeli mieszania. W Hashtable określasz obiekt, który może być używany jako klucz i wartość, która jest zgodna z kluczem.
Zarówno HashMap, jak i Hashtable używają technik mieszania do przechowywania wartości opartych na kluczu. Podobnie jak HashMap, HashTable używa par klucz / wartość do przechowywania wartości w tabeli mieszania. Jednak kluczową różnicą między nimi jest synchronizacja. HashMap to mapa niezsynchronizowana, natomiast HashTable to zsynchronizowana mapa. Oznacza to, że HashMap nie jest bezpieczny dla wątków i nie może być współdzielony między wieloma wątkami bez odpowiedniego kodu synchronizacji. Wręcz przeciwnie, Hashtable jest bezpieczna dla wątków i może być współdzielona między wieloma wątkami. Hashtable jest szybsze niż używanie HashMap w zsynchronizowanym opakowaniu, jeśli potrzebujesz użyć zsynchronizowanej mapy.
Klasa HashMap udostępnia implementację mapy opartą na strukturze danych HashTable. Ta implementacja obsługuje wszystkie operacje na mapie i dopuszcza wiele wartości pustych, ale tylko jeden klucz pusty, aby mógł zachować unikalne właściwości klucza. Nie gwarantuje jednak kolejności, w jakiej zapisywane są zapisy. Z drugiej strony, HashTable odwzorowuje klucze do wartości za pomocą funkcji mieszania. W odróżnieniu od HashMap, Hashtable nie obsługuje wartości null i pustych kluczy, ponieważ w implementacji put metody HashTable jest zerowy.
Ponieważ HashMap nie jest zsynchronizowaną Mapą, jest znacznie szybszy i lepszy od HashTable pod względem wydajności, a w rzeczywistości zużywa mniej pamięci niż HashTable. Chociaż są praktycznie identyczne, HashTable jest nieco wolniejsze niż HashMap, ale szybsze niż zsynchronizowane HashMap. Z natury nie jest bezpieczne używanie Hashtable z dostępem wielowątkowym, ponieważ tylko metody są zsynchronizowane. Hashtable jest zsynchronizowanym odpowiednikiem HashMap. Niezsynchronizowane obiekty działają lepiej w porównaniu do synchronizowanych obiektów, tak jak Hashtable działa lepiej w środowisku z pojedynczym wątkiem.
HashMap vs. HashTable: Tabela porównawcza
Podsumowanie Vs HashMap. Hashtable
Klasa HashMap daje nieposortowaną, nieuporządkowaną mapę. Kiedy więc potrzebujesz mapy i nie interesuje cię kolejność, w której zapisywane są zapisy, to HashMap jest drogą do zrobienia.
Hashtable, podobnie jak Vector, pochodzi z czasów prehistorycznych Jawy. Tak jak Vector jest zsynchronizowanym odpowiednikiem bardziej nowoczesnego i zaawansowanego ArrayList, Hashtable jest zsynchronizowanym odpowiednikiem HashMap. Jednak klasa nie może być zsynchronizowana, więc kiedy mówimy, że Hashtable jest zsynchronizowaną Mapą, oznacza to, że kluczowe metody klasy są zsynchronizowane.
Chociaż oba są praktycznie identyczne, różnica polega na tym, że są zsynchronizowane i jak działają. HashMap działa lepiej w środowisku wielowątkowym, podczas gdy Hashtable działa lepiej w środowisku z pojedynczym gwintem.