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?
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?
Odpowiedzi:
A Set
reprezentuje ogólny „zbiór wartości”. A TreeSet
to zbiór, w którym elementy są posortowane (a tym samym uporządkowane), a HashSet
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's TreeSet
), podczas gdy HashSet
używa Object.hashCode()
do tworzenia indeksu w tablica. Czas dostępu dla czerwono-czarnego drzewa to O(log(n))
czas dostępu dla HashSet
zakresu od czasu stałego do najgorszego przypadku (każdy element ma ten sam hashCode), gdzie można mieć liniowy czas wyszukiwania O(n)
.
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 Set
interfejs, wspierany przez tablicę skrótów (właściwie HashMap
instancję).
Ponieważ HashSet
jest jedną z konkretnych implementacji Set
interfejsu.
A Set
moż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 Comparator
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ć tylko LinkedHashSet
od LinkedHashSet
podklasHashSet
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.
**
** 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.