HashMap i HashSet

Anonim

Kiedy uczysz się nowego języka komputerowego, jedną z pierwszych rzeczy, o które prosisz, jest praca z dużymi grupami danych. Ten temat jest często omawiany w temacie "Struktury danych". Jeśli zagłębisz się głębiej, musisz przejrzeć takie tematy jak połączone listy, kolejki, stosy i drzewa binarne między wieloma innymi strukturami danych. W Javie struktury te są częścią Java Collections Framework. Kolekcja jest niczym innym, jak typem struktury danych, która odnosi się do grupowania wielu elementów danych, a Java Collections Framework standaryzuje sposób, w jaki te grupy obiektów są obsługiwane. W rzeczywistości ramy kolekcji zostały zaprojektowane tak, aby spełniać kilka celów.

Cała struktura kolekcji jest zaprojektowana wokół zestawu standardowych interfejsów. Kilka standardowych implementacji, takich jak LinkedList, HashSet i TreeSet, zapewnia te interfejsy, które mogą być takie, jakie są. Ponadto możesz również zaimplementować własną kolekcję, jeśli wybierzesz. Jednak oprócz zbiorów, środowisko definiuje kilka interfejsów map i klas. Java zawiera trzy implementacje map ogólnego przeznaczenia - HashMap, TreeMap i LinkedHashMap - które przechowują pary klucz / wartość. Chociaż mapy nie są kolekcjami technicznymi, są w pełni zintegrowane z kolekcjami. W rzeczywistości mapy skupiają się na grupach powiązań między obiektami. W tym artykule podsumowano kluczowe różnice między HashMap i HashSet.

Co to jest HashMap?

HashMap to najczęściej stosowana implementacja interfejsu Map, która zapewnia podstawową mapę klucz / wartość, w której elementy są nieuporządkowane. Używa specjalnej wartości zwanej hash, zamiast powolnego wyszukiwania klucza. Kod skrótu jest sposobem na pobranie informacji z danego obiektu i przekształcenie go w "względnie unikatowy" int dla tego obiektu. Działa po prostu na zasadzie mieszania, co oznacza, że ​​używa funkcji mieszającej do mapowania wartości identyfikujących. Podobnie jak Vector i Stack mają swoje zamienniki w ArrayList i LinkedList, Hashtable ma zamiennik w HashMap. Rozszerza AbstractMap o implementację interfejsu Map za pomocą wewnętrznej reprezentacji Hashtable. I podobnie jak inne implementacje ogólnego przeznaczenia, HashMap obsługuje opcjonalne metody Map, dopuszcza wartości puste i nie jest zsynchronizowane.

Co to jest HashSet?

HashSet jest jednym z członków Java Collection Framework, który implementuje interfejs Set, wspierany przez tablicę asocjacyjną, która jest w rzeczywistości instancją HashMap. Jak sama nazwa wskazuje, jest zaimplementowana przez tablicę haszującą, tablicę, w której elementy są przechowywane w pozycji wyprowadzonej z ich zawartości. W przeciwieństwie do mapy, zestaw jest dokładnie kolekcją z dokładnie tym samym interfejsem, więc nie ma żadnej dodatkowej funkcjonalności, jak to ma miejsce z dwoma różnymi listami. HashSet korzysta z funkcji haszowania, zaprojektowanej specjalnie do szybkiego wyszukiwania. Jest to nieuporządkowana kolekcja unikalnych obiektów, które nie mogą przechowywać zduplikowanych wartości. HashSet rozszerza klasę AbstractSet, która implementuje interfejs Set. Jednak HashSet nie definiuje żadnych dodatkowych metod innych niż te dostarczone przez jego nadklasy i interfejsy.

Różnica między HashMap i HashSet

  1. Podstawowy

HashMap to najczęściej stosowana implementacja interfejsu Map, która zapewnia podstawową mapę klucz / wartość, w której elementy są nieuporządkowane. Działa po prostu na zasadzie mieszania, co oznacza, że ​​używa funkcji mieszającej do mapowania wartości identyfikujących. Z drugiej strony, HashSet jest jednym z członków Java Collections Framework, który implementuje interfejs Set, wspierany przez tablicę asocjacyjną, która jest w rzeczywistości instancją HashMap. Mówiąc prościej, HashMap implementuje interfejs Map, podczas gdy HashSet implementuje interfejs Set.

  1. Funkcjonalność

HashSet tworzy kolekcję, która używa tabeli mieszania do przechowywania. Tabela skrótu przechowuje informacje przy użyciu metody o nazwie hashing. HashSet używa funkcji hashowania, która jest specjalnie zaprojektowana do szybkiego wyszukiwania, do przechowywania elementów lub wartości. Większość funkcji HashSet zapewnia klasa nadrzędna AbstractCollection i AbstractSet, którą HashSet współdzieli z TreeSet. HashMap rozszerza AbstractMap o implementację interfejsu Map za pomocą wewnętrznej reprezentacji Hashtable. Obie klasy nie są zsynchronizowane, co oznacza, że ​​nie są odpowiednie do obsługi wątków.

  1. Zduplikowane wartości

Ponieważ mapa nie obsługuje duplikatów kluczy, HashMap nie pozwala na duplikowanie kluczy, ale może mieć zduplikowane wartości. Oznacza to, że powielone wartości mogą istnieć w HashMap, ale możesz użyć kolekcji jako wartości względem jakiegoś klucza. Każdy klucz musi być unikalny w HashMap i pojedynczy klucz nie może mieć więcej niż 1 wartość. HashSet, z drugiej strony, nie może mieć duplikatów elementów przez samą definicję zbioru, co oznacza, że ​​nie można przechowywać zduplikowanych wartości w HashSet. HashMap pozwala tylko na jeden pusty klucz, ale pozwala na dowolną liczbę wartości pustych, podczas gdy HashSet pozwala tylko na jedną wartość pustą.

  1. Przechowywanie mechanizmu

HashMap działa na zasadzie mieszania, co oznacza, że ​​używa funkcji mieszania do mapowania wartości identyfikacyjnych wewnętrznie za pomocą algorytmu mieszania w celu umożliwienia łatwego pobierania. Prawdziwy mechanizm mieszający zawsze zwraca ten sam kod haszowania (), gdy jest on stosowany do tego samego obiektu. Z drugiej strony, HashSet używa wewnętrznie HashMap jako struktury danych stanowiących kopię zapasową do dodawania lub przechowywania obiektów. Oznacza to, że gdy tworzony jest obiekt HashSet, utworzy obiekt HashMap.

HashMap vs. HashSet: Tabela porównawcza

Podsumowanie Vs HashMap. HashSet

Chociaż zarówno HashMap, jak i HashSet nie są zsynchronizowane, co oznacza, że ​​nie są odpowiednie do operacji wymagających obsługi wątków i są to całkowicie różne konstrukcje, zapewniają one stałą wydajność w czasie dla podstawowych operacji, takich jak dodawanie, usuwanie elementów itp. Podczas gdy HashMap jest uniwersalnym Interfejs Map, który przechowuje pary klucz / wartość, HashSet jest implementacją interfejsu Set. A HashSet używa HashMap do poparcia swojej implementacji. Jednak HashMap stosuje zasadę hashowania i używa jej do szybkiego polowania na klucz.