Kiedy uczysz się nowego języka komputerowego, jedną z pierwszych rzeczy, o które pytasz, jest praca z dużymi grupami danych. Temat ten jest często omawiany w temacie „Struktury danych”. Jeśli zagłębisz się głębiej, musisz znaleźć wiele innych tematów, takich jak listy połączone, kolejki, stosy i drzewa binarne. W Javie struktury te są częścią Java Collections Framework. Kolekcja jest niczym innym, jak rodzajem 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 struktura kolekcji została zaprojektowana tak, aby osiągnąć kilka celów.
Cała struktura kolekcji została zaprojektowana wokół zestawu standardowych interfejsów. Kilka standardowych implementacji, takich jak LinkedList, HashSet i TreeSet, zapewnia tych interfejsów, które możesz na bieżąco. Ponadto, jeśli chcesz, możesz również wdrożyć własną kolekcję. Jednak oprócz kolekcji ś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ż technicznie mapy nie są kolekcjami, są w pełni zintegrowane z kolekcjami. W rzeczywistości mapy koncentrują się na grupach powiązań między obiektami. W tym artykule podsumowano najważniejsze różnice między HashMap i HashSet.
HashMap jest najczęściej stosowaną implementacją interfejsu Map, który zapewnia podstawową mapę klucz / wartość, w której elementy są nieuporządkowane. Używa specjalnej wartości zwanej kodem skrótu, zamiast powolnego wyszukiwania klucza. Kod skrótu jest sposobem na pobranie informacji z danego obiektu i przekształcenie jej w „względnie unikalny” int dla tego obiektu. Po prostu działa na zasadzie skrótu, co oznacza, że używa funkcji skrótu do mapowania identyfikujących wartości. Podobnie jak Vector i Stack mają 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 zerowe i nie jest synchronizowany.
HashSet jest jednym z elementów Java Collections Framework, który implementuje interfejs Set, wspierany przez tablicę skrótów, która w rzeczywistości jest instancją HashMap. Jak sama nazwa wskazuje, jest on implementowany przez tablicę skrótów, tablicę, w której elementy są przechowywane w pozycji wynikającej 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 w przypadku dwóch różnych list. HashSet korzysta z funkcji skrótu, która została zaprojektowana 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 poza metodami zapewnianymi przez jego nadklasy i interfejsy.
HashMap jest najczęściej stosowaną implementacją interfejsu Map, który zapewnia podstawową mapę klucz / wartość, w której elementy są nieuporządkowane. Po prostu działa na zasadzie skrótu, co oznacza, że używa funkcji skrótu do mapowania identyfikujących wartości. HashSet, z drugiej strony, jest jednym z elementów Java Collections Framework, który implementuje interfejs Set, wspierany przez tablicę skrótów, która w rzeczywistości jest instancją HashMap. Krótko mówiąc, HashMap implementuje interfejs Map, podczas gdy HashSet implementuje interfejs Set.
HashSet tworzy kolekcję, która używa tabeli skrótów do przechowywania. Tabela mieszania przechowuje informacje za pomocą metody zwanej haszowaniem. HashSet używa funkcji skrótu, która została zaprojektowana specjalnie do szybkiego wyszukiwania, do przechowywania elementów lub wartości. Większość funkcji HashSet jest zapewniona przez superklasę AbstractCollection i AbstractSet, którą HashSet udostępnia wspólnie z TreeSet. HashMap rozszerza AbstractMap o implementację interfejsu Map przy użyciu wewnętrznej reprezentacji Hashtable. Obie klasy nie są zsynchronizowane, co oznacza, że nie nadają się do operacji bezpiecznych dla wątków.
Ponieważ Map nie obsługuje duplikatów kluczy, HashMap nie zezwala na duplikaty kluczy, ale może mieć zduplikowane wartości. Oznacza to, że w HashMap mogą istnieć zduplikowane wartości, ale można użyć kolekcji jako wartości względem jakiegoś klucza. Każdy klucz musi być unikalny w HashMap, a pojedynczy klucz nie może mieć więcej niż 1 wartości. Z drugiej strony HashSet nie może mieć zduplikowanych elementów na podstawie samej definicji zestawu, co oznacza, że nie można przechowywać zduplikowanych wartości w HashSet. HashMap dopuszcza tylko jeden klucz zerowy, ale dopuszcza dowolną liczbę wartości zerowych, podczas gdy HashSet dopuszcza tylko jedną wartość zerową.
HashMap działa na zasadzie skrótu, co oznacza, że używa funkcji skrótu do mapowania identyfikujących wartości wewnętrznie za pomocą algorytmu skrótu, aby umożliwić łatwe pobieranie. Prawdziwy mechanizm mieszający zawsze zwraca ten sam hashCode () po zastosowaniu do tego samego obiektu. Z kolei HashSet wewnętrznie używa HashMap jako struktury danych kopii zapasowej do dodawania lub przechowywania obiektów. Oznacza to, że po utworzeniu obiektu HashSet utworzy on obiekt HashMap.
Chociaż zarówno HashMap, jak i HashSet nie są zsynchronizowane, co oznacza, że nie są odpowiednie do operacji bezpiecznych dla wątków i są całkowicie różnymi konstrukcjami, zapewniają stałą wydajność czasową dla podstawowych operacji, takich jak dodawanie, usuwanie elementu itp. Podczas gdy HashMap jest ogólną implementacją Interfejs mapy, który przechowuje pary klucz / wartość, HashSet jest implementacją interfejsu Set. HashSet używa HashMap do wykonania swojej implementacji. Jednak HashMap korzysta z zasady mieszania i używa jej do szybkiego szukania klucza.