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.
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.
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ś, A HashSet
używa a HashMap
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 .
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.
HashSet nie jest zsynchronizowany, co oznacza, że nie nadają się do operacji bezpiecznych wątkowo, dopóki nie zostaną zsynchronizowane jawnie. [Podobieństwo]
add contains next notes
HashSet O(1) O(1) O(h/n) h is the table
HashMap nie jest synchronizowany, co oznacza, że nie nadają się do operacji bezpiecznych wątkowo, dopóki nie zostaną zsynchronizowane jawnie. [Podobieństwo]
get containsKey next Notes
HashMap O(1) O(1) O(h/n) h is the table
Zapoznaj się z tym artykułem, aby znaleźć więcej informacji.
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.
Te Hashset
narzędzia z wewnętrznym HashMap
. 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. gdzie HashSet
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
i HashMap
nie zachowuje kolejności wstawiania podczas iteracji.Jak sugerują nazwy, HashMap jest mapą asocjacyjną (mapowaniem z klucza do wartości), a HashSet to tylko zestaw .
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:
public boolean add(E e)
{
return map.put(e, PRESENT)==null;
}
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óż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.
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.
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).
HashSet jest realizowany w kategoriach HashMap . Jest to mapowanie między kluczem a OBECNYM obiektem.
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.
HashMap
jest Map
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:
{The-> 3, world-> 5, is-> 2, nice-> 4}
HashSet
jest Set
implementacją, która nie pozwala na duplikaty. Jeśli próbowałeś dodać zduplikowany obiekt, wywołanie public boolean add(Object o)
metody, to zestaw pozostaje niezmieniony i wraca false
. na przykład:
[Świat jest fajny]
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.
java.util.HashSet
mówi, że jest wspierany przez plik java.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.
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
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.
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