HashMap i LinkedHashMap to dwie najbardziej powszechne i ogólnego przeznaczenia implementacje Map w platformie Java. Są to w zasadzie klasy oparte na hasłach, dość podobne do siebie i służą do tworzenia Mapy. Interfejs Map jest ostatnim z głównych interfejsów Collections Framework, który definiuje operacje, które są obsługiwane przez zestaw skojarzeń klucz-wartość, w których klucze są unikalne. Te implementacje Map opierają się na algorytmie haszowania. Podczas gdy klasa HashMap implementuje mapy nieuporządkowane, klasa LinkedHashMap implementuje mapy uporządkowane. Implementacja LinkedHashMap jest podklasą klasy HashMap, co oznacza, że dziedziczy cechy klasy HashMap. Pod względem wydajności nie ma między nimi zbyt dużej różnicy. Przyjrzyjmy się.

Co to jest HashMap?

HashMap jest jedną z najbardziej powszechnych i spośród czterech implementacji ogólnego przeznaczenia interfejsu Map w Javie opartego na algorytmie haszowania. Jest analogiczna do klasy zbiorów HashSet, chociaż, elementy są nieuporządkowane w obu klasach. Jest zaimplementowany jako tablica haszująca, ale w przeciwieństwie do LinkedHashMap, nie utrzymuje żadnego porządku na kluczach lub wartościach. Ogólnie rzecz biorąc, HashMap zapewnia wydajność w czasie ciągłym dla put i get. Klasa nie jest bezpieczna dla wątków, ale pozwala na jeden klucz null i wiele wartości null. Ponieważ nie utrzymuje porządku iteracyjnego, wymaga mniej pamięci.

Co to jest LinkedHashMap?

LinkedHashMap jest jedną z czterech implementacji ogólnego przeznaczenia interfejsu Map, która jest podklasą klasy HashMap, co oznacza, że dziedziczy jej cechy. Chociaż jest bardzo podobny do HashMap pod względem wydajności, z wyjątkiem tego, że utrzymuje kolejność wstawiania kluczy, albo w kolejności, w której klucze są wstawiane do Mapy, albo w kolejności, w której wpisy są dostępne w Mapie. Uszlachetnia kontrakt swojej klasy macierzystej, gwarantując kolejność, w jakiej iteratory zwracają swoje elementy. Jednak wymaga więcej pamięci niż HashMap, ponieważ utrzymuje podwójnie powiązaną listę w Javie.

Różnica między HashMap a LinkedHashMap

Podstawy HashMap Vs. LinkedHashMap

HashMap to oparta na haszu implementacja interfejsu Map w Javie. Mapy są kolekcją par klucz-wartość i są używane, gdy Listy są w uporządkowanej kolekcji. HashMap to klasa Collection, która przechowuje wartość w parach klucz-wartość. W prostych słowach, mapuje klucze na wartości, co oznacza, że może zlokalizować wartość na podstawie klucza. LinkedHashMap jest implementacją interfejsu Map w postaci listy połączonej, podobnie jak HashMap, z wyjątkiem tego, że zachowuje kolejność wstawianych do niej elementów. Jest to podklasa HashMap, która dziedziczy jej cechy. LinkedHashMap udoskonala kontrakt swojej klasy macierzystej, HashMap, poprzez zagwarantowanie kolejności, w jakiej iteratory zwracają jej elementy.

Kolejność iteracji

Kluczową różnicą między HashMap a LinkedHashMap jest porządek. Elementy HashMap nie są uporządkowane, całkowicie losowe, natomiast elementy LinkedHashMap są uporządkowane. Wpisy LinkedHashMap są w kolejności wstawiania kluczy, czyli kolejności, w jakiej klucze są wstawiane do Mapy. Oznacza to, że pierwszy klucz wstawiony do Mapy jest wyliczany jako pierwszy, podobnie jak wartość z nim związana, a ostatni wstawiony wpis wyliczany jest jako ostatni. LinkedHashMap ma przewidywalny porządek iteracji, co oznacza, że może również utrzymywać swoje elementy w porządku dostępu, czyli w kolejności, w jakiej wpisy są dostępne.

Implementacja

Obie klasy HashMap i LinkedHashMap używają hashowania do implementacji interfejsu Map w Javie, z tym że HashMap jest zaimplementowana jako tablica hashowa, podczas gdy LinkedHashMap utrzymuje podwójnie połączoną listę Buckets przebiegającą przez wszystkie jej wpisy. Dlatego LinkedHashMap wymaga więcej pamięci niż HashMap, ponieważ w przeciwieństwie do HashMap utrzymuje porządek. Usuwa chaotyczne porządkowanie przez HashMap, bez ponoszenia dodatkowych kosztów, które zostałyby poniesione w przeciwnym razie z TreeMap. Poza tym klasa LinkedHashMap jest bardzo podobna do klasy HashMap w wielu aspektach, takich jak synchronizacja i klucze / wartości null, ponieważ oba pozwalają na jeden klucz null i wiele wartości null.

Wydajność dla HashMap Vs. LinkedHashMap

Chociaż obie klasy zapewniają porównywalną wydajność, uważa się, że klasa HashMap jest preferowanym wyborem, jeśli porządek nie jest problemem, ponieważ nie gwarantuje ona kolejności iteracji Mapy. Operacje takie jak dodawanie, usuwanie lub znajdowanie wpisów na podstawie klucza są stałym czasem, ponieważ haszują klucz. Tak więc dodawanie, usuwanie i znajdowanie wpisów w LinkedHashMap może być nieco wolniejsze niż w HashMap, ponieważ utrzymuje podwójnie powiązaną listę Buckets w Javie. Dodatkowo HashMap wymaga mniej pamięci niż LinkedHashMap, ponieważ nie jest utrzymywana kolejność.

Podsumowanie HashMap Vs. LinkedHashMap

Podczas gdy obie klasy HashMap i HashMap mają niemal podobną wydajność, HashMap wymaga mniej pamięci niż LinkedHashMap, ponieważ nie gwarantuje iteracyjnej kolejności mapy, co sprawia, że dodawanie, usuwanie i znajdowanie wpisów w HashMap jest stosunkowo szybsze niż robienie tego samego z LinkedHashMap. Jednak kluczową różnicą między nimi jest kolejność: elementy HashMap nie są uporządkowane, podczas gdy elementy LinkedHashMap są w kolejności wstawiania kluczy, co domyślnie oznacza kolejność, w jakiej klucze są wstawiane do mapy. LinkedHashMap może również utrzymywać swoje elementy w porządku dostępu oznaczającym kolejność, w której wpisy są dostępne. Ponieważ w przypadku LinkedHashMap należy utrzymywać listę podwójnie powiązaną, ma ona mniejszą wydajność niż HashMap.