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).
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)
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 ()).
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
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).
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.
Odpowiedzi:
A
Set
reprezentuje ogólny „zbiór wartości”. ATreeSet
to zbiór, w którym elementy są posortowane (a tym samym uporządkowane), aHashSet
to zbiór, w którym elementy nie są posortowane ani uporządkowane.A
HashSet
jest zwykle dużo szybszy niżTreeSet
.A
TreeSet
jest zwykle implementowane jako czerwono-czarne drzewo (patrz http://en.wikipedia.org/wiki/Red-black_tree - nie zweryfikowałem rzeczywistej implementacji sun / oracle'sTreeSet
), podczas gdyHashSet
używaObject.hashCode()
do tworzenia indeksu w tablica. Czas dostępu dla czerwono-czarnego drzewa toO(log(n))
czas dostępu dlaHashSet
zakresu od czasu stałego do najgorszego przypadku (każdy element ma ten sam hashCode), gdzie można mieć liniowy czas wyszukiwaniaO(n)
.źródło
HashSet
Jest implementacjąSet
.źródło
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 ()).
źródło
Zestaw to kolekcja, która nie zawiera zduplikowanych elementów. Zestaw to interfejs.
HashSet implementuje
Set
interfejs, wspierany przez tablicę skrótów (właściwieHashMap
instancję).Ponieważ
HashSet
jest jedną z konkretnych implementacjiSet
interfejsu.A
Set
może być dowolną z następujących, ponieważ została zaimplementowana przez poniższe klasyConcurrentSkipListSet : skalowalna współbieżna implementacja NavigableSet oparta na
ConcurrentSkipListMap
. Elementy zestawu są sortowane zgodnie z ich naturalną kolejnością lub wedługComparator
podanego 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
HashSet
może być tylkoLinkedHashSet
odLinkedHashSet
podklasHashSet
źródło
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).
źródło
Set jest interfejsem nadrzędnym wszystkich klas zestawów, takich jak TreeSet, LinkedHashSet itp.
HashSet to klasa implementująca interfejs Set.
źródło
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.
źródło
**
** 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.
**
**
Może używać jednej wartości NULL (ponieważ Duplikat jest niedozwolony), dane są przechowywane losowo, ponieważ nie zachowują kolejności.
źródło