Poza tym, że HashSet
nie zezwala na zduplikowane wartości, jaka jest różnica między HashMap
i HashSet
?
Mam na myśli mądre wdrożenie? Jest to trochę niejasne, ponieważ obie używają tablic mieszających do przechowywania wartości.
java
collections
hashmap
hashset
SpikETidE
źródło
źródło
Odpowiedzi:
Są to zupełnie inne konstrukcje. A
HashMap
jest implementacjąMap
. Mapa odwzorowuje klucze do wartości. Wyszukiwanie klucza odbywa się za pomocą skrótu.Z drugiej strony, a
HashSet
jest implementacjąSet
. Zestaw został zaprojektowany, aby dopasować model matematyczny zestawu. Jak zauważyłeś, AHashSet
używa aHashMap
do poparcia swojej implementacji. Jednak implementuje zupełnie inny interfejs.Jeśli szukasz tego, co będzie najlepsze
Collection
do twoich celów, ten samouczek jest dobrym punktem wyjścia. Jeśli naprawdę chcesz wiedzieć, co się dzieje, jest też książka o tym .źródło
HashSet to zestaw , np. {1,2,3,4,5}
HashMap to mapa klucz -> wartość (klucz do wartości), np. {A -> 1, b -> 2, c -> 2, d -> 1}
Zauważ, że w powyższym przykładzie w HashMap nie może być zduplikowanych kluczy, ale mogą one mieć zduplikowane wartości.
W HashSet nie może być żadnych zduplikowanych elementów.
źródło
HashSet
HashSet nie jest zsynchronizowany, co oznacza, że nie nadają się do operacji bezpiecznych wątkowo, dopóki nie zostaną zsynchronizowane jawnie. [Podobieństwo]
HashMap
HashMap nie jest synchronizowany, co oznacza, że nie nadają się do operacji bezpiecznych wątkowo, dopóki nie zostaną zsynchronizowane jawnie. [Podobieństwo]
Zapoznaj się z tym artykułem, aby znaleźć więcej informacji.
źródło
Szkoda, że obie nazwy zaczynają się od Hash . To najmniej ważna część z nich. Ważne części pojawiają się po skrócie - zestaw i mapa , jak zauważyli inni. Tym, czym są, są odpowiednio Zestaw - nieuporządkowana kolekcja - i Mapa - kolekcja z dostępem z kluczem. Tak się składa, że są implementowane za pomocą skrótów - stąd pochodzą nazwy - ale ich esencja jest ukryta za tą częścią ich nazw.
Nie dajcie się zmylić ich imionami; są to bardzo różne rzeczy.
źródło
Te
Hashset
narzędzia z wewnętrznymHashMap
. Jeśli widzisz implementację wewnętrzną, wartości wstawione w HashSet są przechowywane jako klucze w HashMap, a wartość jest obiektem Dummy klasy Object.Różnica między HashMap a HashSet to: -
HashMap
zawiera pary klucz-wartość, a do każdej wartości można uzyskać dostęp za pomocą klucza, w którym HashSet musi być za każdym razem iterowany, ponieważ nie ma metody get.HashMap
implementuje interfejs Map i zezwala na jedną wartość null jako klucz i wiele wartości null jako wartości. gdzieHashSet
implementuje interfejs Set, dopuszcza tylko jedną wartość null i brak zduplikowanych wartości. (Pamiętaj, że jeden pusty klucz jest dozwolony w kluczu HashMap, stąd jedna wartość null w HashSet ponieważ HashSet implementuje wewnętrznie HashMap).HashSet
iHashMap
nie zachowuje kolejności wstawiania podczas iteracji.źródło
HashSet pozwala nam na przechowywanie obiektów w zestawie, gdzie jak HashMap pozwala na przechowywanie obiektów na podstawie klucza i wartości. Każdy obiekt lub obiekt przechowywany będzie miał klucz.
źródło
Jak sugerują nazwy, HashMap jest mapą asocjacyjną (mapowaniem z klucza do wartości), a HashSet to tylko zestaw .
źródło
Różnice między HashSet i HashMap w Javie
1) Pierwsza i najbardziej znacząca różnica między HashMap i HashSet polega na tym, że HashMap jest implementacją interfejsu Map, podczas gdy HashSet jest implementacją interfejsu Set, co oznacza, że HashMap jest strukturą danych opartą na kluczowej wartości, a HashSet gwarantuje wyjątkowość, nie zezwalając na duplikaty. reality HashSet to wrapper wokół HashMap w Javie, jeśli spojrzysz na kod metody add (E e) HashSet.java, zobaczysz następujący kod:
gdzie umieszczenie obiektu na mapie jako klucza i wartości jest ostatecznym obiektem OBECNY, który jest fikcyjny.
2) Druga różnica między HashMap i HashSet polega na tym, że używamy metody add () do umieszczania elementów w Set, ale używamy metody put () do wstawiania klucza i wartości do HashMap w Javie.
3) HashSet zezwala tylko na jeden klucz pusty, ale HashMap może zezwalać na jeden klucz pusty + wiele wartości null.
To wszystko na różnicy między HashSet i HashMap w Javie. Podsumowując, HashSet i HashMap to dwa różne typy kolekcji, jedna to Set, a druga to Map.
źródło
Różnice między HashSet i HashMap w Javie
HashSet wewnętrznie używa HashMap do przechowywania obiektów. Gdy metoda add (String) nazywa ją wywołuje metodę HahsMap put (klucz, wartość), gdzie klucz = obiekt ciągu i wartość = nowy obiekt (Dummy). Więc nie zachowuje duplikatów, ponieważ klucze są niczym innym jak wartością Obiekt.
Obiekty, które są przechowywane jako klucz w Hashset / HashMap, powinny przesłonić hashcode i equals contract.
Klucze używane do uzyskiwania dostępu / przechowywania obiektów wartości w HashMap powinny być zadeklarowane jako końcowe, ponieważ po zmodyfikowaniu obiektu wartości nie można zlokalizować i zwraca wartość null.
źródło
A
HashMap
polega na dodawaniu, pobieraniu, usuwaniu ... obiektów indeksowanych przez niestandardowy klucz dowolnego typu.A
HashSet
polega na dodawaniu elementów, usuwaniu elementów i sprawdzaniu, czy elementy są obecne, porównując ich skróty.Zatem HashMap zawiera elementy, a HashSet zapamiętuje ich skróty.
źródło
equals()
metody.Różnice: w odniesieniu do hierarchii: HashSet implementuje Set. HashMap implementuje Map i przechowuje mapowanie kluczy i wartości.
Zastosowanie HashSet i HashMap w odniesieniu do bazy danych pomoże ci zrozumieć znaczenie każdego z nich.
HashSet: jest zwykle używany do przechowywania unikatowych obiektów kolekcji. Np .: Może być użyty jako klasa implementacji do przechowywania relacji wiele do jednego pomiędzy
klasą Przedmiot a Klasą Oferta, gdzie (Przedmiot ma wiele ofert) HashMap: służy do mapowania klucza do wartości. Wartość może być zerowa lub dowolny obiekt / lista obiektu (który sam w sobie jest obiektem).
źródło
HashSet jest realizowany w kategoriach HashMap . Jest to mapowanie między kluczem a OBECNYM obiektem.
źródło
HashSet używa HashMap wewnętrznie do przechowywania swoich wpisów. Każdy wpis w wewnętrznej HashMap jest kluczowany przez pojedynczy obiekt, więc wszystkie wpisy są mieszane w tym samym zasobniku. Nie pamiętam, czego używa wewnętrzna HashMap do przechowywania swoich wartości, ale tak naprawdę nie ma to znaczenia, ponieważ ten wewnętrzny kontener nigdy nie będzie zawierał zduplikowanych wartości.
EDYCJA : Aby odnieść się do komentarza Matthew, ma rację; Miałem to od tyłu. Wewnętrzna mapa HashMap jest kluczowana za pomocą obiektów, które tworzą elementy Set . Wartości HashMap to obiekt, który jest po prostu przechowywany w zasobnikach HashMap.
źródło
HashMap
jestMap
implementacją umożliwiającą zduplikowane wartości, ale nie zduplikowane klucze. . Do dodania obiektu wymagana jest para klucz / wartość. Dozwolone są klucze o wartości Null i wartości Null. na przykład:HashSet
jestSet
implementacją, która nie pozwala na duplikaty. Jeśli próbowałeś dodać zduplikowany obiekt, wywołaniepublic boolean add(Object o)
metody, to zestaw pozostaje niezmieniony i wracafalse
. na przykład:źródło
właściwie odpowiedziałeś na swoje własne pytanie - hashset nie zezwala na zduplikowane wartości. byłoby trywialne zbudowanie hashsetu przy użyciu bazowej mapy hash (i po prostu sprawdzenie, czy wartość już istnieje). Sądzę, że różne implementacje java albo to robią, albo implementują jakiś niestandardowy kod, aby robić to bardziej wydajnie.
źródło
java.util.HashSet
mówi, że jest wspierany przez plikjava.util.HashMap
.Zasadniczo w HashMap użytkownik musi podać zarówno klucz, jak i wartość, podczas gdy w HashSet podajesz tylko wartość, klucz jest uzyskiwany automatycznie z wartości przy użyciu funkcji skrótu. Więc po posiadaniu zarówno klucza, jak i wartości, HashSet może być wewnętrznie przechowywany jako HashMap.
źródło
HashSet i HashMap obie pary sklepów, różnica polega na tym, że w HashMap możesz określić klucz, podczas gdy w HashSet klucz pochodzi z kodu skrótu obiektu
źródło
HashMaps
zezwalaj na jeden klucz pusty i wartości null. Nie są zsynchronizowane, co zwiększa wydajność. Jeśli jest to wymagane, możesz je zsynchronizować za pomocąCollections.SynchronizedMap()
Hashtables
nie zezwalaj na klucze puste i są zsynchronizowane.źródło
HashMap to implementacja interfejsu Map. HashSet jest implementacją interfejsu Set
HashMap Przechowuje dane w postaci pary klucz-wartość HashSet Store tylko obiekty
Metoda Put służy do dodawania elementu na mapie Metoda Add służy do dodawania elementu Set
W mapie skrótów wartość hashcode jest obliczana za pomocą obiektu kluczowego W tym przypadku obiekt członkowski służy do obliczania wartości kodu skrótu, która może być taka sama dla dwóch obiektów, więc metoda equal () jest używana do sprawdzania równości, jeśli zwraca false, co oznacza, że dwa obiekty są różne.
HashMap jest szybszy niż hashset, ponieważ unikalny klucz jest używany do uzyskiwania dostępu do obiektu HashSet jest wolniejszy niż Hashmap
źródło