Jaka jest różnica między HashSet a Set?

83

Widziałem fragment kodu, taki jak

Set<Record> instances = new HashSet<Record>();

Zastanawiam się, czy Hashset to specjalny zestaw. Jakaś różnica między nimi?

user496949
źródło
8
Może zechcesz sprawdzić koncepcję interfejsów
Nikita Rybak

Odpowiedzi:

101

A Setreprezentuje ogólny „zbiór wartości”. A TreeSetto zbiór, w którym elementy są posortowane (a tym samym uporządkowane), a HashSetto zbiór, w którym elementy nie są posortowane ani uporządkowane.

A HashSetjest zwykle dużo szybszy niż TreeSet.

A TreeSetjest zwykle implementowane jako czerwono-czarne drzewo (patrz http://en.wikipedia.org/wiki/Red-black_tree - nie zweryfikowałem rzeczywistej implementacji sun / oracle's TreeSet), podczas gdy HashSetużywa Object.hashCode()do tworzenia indeksu w tablica. Czas dostępu dla czerwono-czarnego drzewa to O(log(n))czas dostępu dla HashSetzakresu od czasu stałego do najgorszego przypadku (każdy element ma ten sam hashCode), gdzie można mieć liniowy czas wyszukiwania O(n).

Erik
źródło
Dodatkowo istnieją następujące implementacje ogólnego przeznaczenia: LinkedHashSet (wariant HashSet, który zachowuje pewien porządek dla Iteratora), ConcurrentSkipListSet (implementacja Threadave SortedSet), CopyOnWriteArraySet (wariant bezpieczny dla wątków zoptymalizowany pod kątem „dużej ilości odczytów, bardzo rzadko writes ”), EnumSet (który działa tylko na typach wyliczeniowych dla elementów, ale jest nawet szybszy niż HashSet).
Paŭlo Ebermann
7
@Erik: Proszę o zmianę Twojej odpowiedzi. TreeSet jest posortowane, a nie uporządkowane. HashSet = Unordered, TreeSet = sortowane, LinkedHashSet = uporządkowane. Proszę odpowiednio zmodyfikować swoją odpowiedź
Rais Alam,
Hashset może być wolniejszy, jeśli implementacja hashCode jest zła (np. Zawsze zwraca ten sam kod)
Romain Hautefeuille
35

HashSetJest implementacją Set.

vaugham
źródło
14
Nie rozumiem tego komentarza. Pytanie brzmi „jaka jest różnica”, a nie „jaka jest zależność między”.
jambox
8
Wyjaśnił różnicę, Set to interfejs, HashSet to implementacja tego interfejsu. Dlatego nie są to różne implementacje, po prostu HashSet jest jedną z implementacji Set (druga implementacja to TreeSet).
AggieDev
brzmi dla mnie jak ważna odpowiedź
Romain Hautefeuille
3
Zostawiłem ci głos przeciw, ponieważ w ogóle nie odpowiedziałeś na pytanie. W przyszłości zalecam dodanie dokumentacji, przykładów i porównań. Samo napisanie jednego zdania, a większość treści to tylko linki do innych miejsc, to NIE jest sposób, w jaki odpowiadasz na pytania dotyczące przepełnienia stosu.
Urda
Odpowiedź na to pytanie udzielono 6 lat temu (patrz wyżej), ale dziękuję.
vaugham
16

Odpowiedź na pytanie została udzielona, ​​ale nie widziałem odpowiedzi, dlaczego kod wspomina oba typy w tym samym kodzie.

Zwykle chcesz kodować w oparciu o interfejsy, które w tym przypadku są ustawione. Czemu? Ponieważ jeśli zawsze odwołujesz się do obiektu przez interfejsy (z wyjątkiem nowej HashSet ()), to trywialne jest późniejsze zmiany implementacji obiektu, jeśli uznasz, że byłoby lepiej, ponieważ wspomniałeś o tym tylko raz w kodzie base (gdzie zrobiłeś new HashSet ()).

MeBigFatGuy
źródło
14

Zestaw to kolekcja, która nie zawiera zduplikowanych elementów. Zestaw to interfejs.

HashSet implementuje Setinterfejs, wspierany przez tablicę skrótów (właściwie HashMapinstancję).

Ponieważ HashSetjest jedną z konkretnych implementacji Setinterfejsu.

A Setmoże być dowolną z następujących, ponieważ została zaimplementowana przez poniższe klasy

ConcurrentSkipListSet : skalowalna współbieżna implementacja NavigableSet oparta na ConcurrentSkipListMap. Elementy zestawu są sortowane zgodnie z ich naturalną kolejnością lub według Comparatorpodanego w czasie tworzenia zestawu, w zależności od używanego konstruktora.

CopyOnWriteArraySet : zestaw, który używa wewnętrznej CopyOnWriteArrayList do wszystkich swoich operacji.

EnumSet : wyspecjalizowana implementacja zestawu do użytku z typami wyliczenia. Wszystkie elementy w zestawie wyliczeń muszą pochodzić z jednego typu wyliczenia, który jest określony jawnie lub niejawnie podczas tworzenia zestawu.

TreeSet : implementacja NavigableSet oparta na TreeMap. Elementy są porządkowane przy użyciu ich naturalnego porządku lub przez komparator dostarczany w określonym czasie tworzenia, w zależności od używanego konstruktora.

LinkedHashSet : implementacja tabeli ash i listy połączonej interfejsu Set z przewidywalną kolejnością iteracji. Ta implementacja różni się od HashSet tym, że utrzymuje podwójnie połączoną listę obejmującą wszystkie jej wpisy.

Ale HashSetmoże być tylko LinkedHashSetod LinkedHashSetpodklasHashSet

Ravindra babu
źródło
8

Set jest ogólnym interfejsem kolekcji podobnej do zestawu, podczas gdy HashSet to specyficzna implementacja interfejsu Set (który używa kodów skrótów, stąd nazwa).

gmw
źródło
2

Set jest interfejsem nadrzędnym wszystkich klas zestawów, takich jak TreeSet, LinkedHashSet itp.

HashSet to klasa implementująca interfejs Set.

unk1102
źródło
0

HashSet to klasa wywodząca się z interfejsu Set. Jako klasa pochodna Set HashSet uzyskuje właściwości Set. Ważne i najczęściej używane klasy pochodne Set to HashSet i TreeSet.

Hemlata Gehlot
źródło
-1

**

  • Zestaw:

** Jest to interfejs będący podtypem interfejsu Collection, podobnie jak LISTA i QUEUE.

Zestaw posiada poniżej 3 podklasy, służy do przechowywania wielu obiektów bez duplikatów.

  1. HashSet
  2. LinkedHashSet
  3. TreeSet (który implementuje interfejs SortedSet)

**

  • HashSet:

**

Może używać jednej wartości NULL (ponieważ Duplikat jest niedozwolony), dane są przechowywane losowo, ponieważ nie zachowują kolejności.

Anonimowy użytkownik
źródło