Jaka jest różnica między nimi? wiem to
LinkedHashSet to uporządkowana wersja HashSet, która utrzymuje podwójnie połączoną listę wszystkich elementów. Użyj tej klasy zamiast HashSet, jeśli zależy Ci na kolejności iteracji. Podczas iteracji przez HashSet kolejność jest nieprzewidywalna, podczas gdy LinkedHashSet umożliwia iterację elementów w kolejności, w jakiej zostały wstawione.
Ale w kodzie źródłowym LinkedHashSet są tylko wywołujące konstruktory HashSet. Więc gdzie jest podwójnie połączona lista i zamówienie reklamowe?
java
hashset
linkedhashset
Shikarn-O
źródło
źródło
Odpowiedzi:
Odpowiedź tkwi w których konstruktorzy z
LinkedHashSet
zastosowania do skonstruowania klasy podstawowej:I (jeden przykład)
HashSet
konstruktora, który przyjmuje argument logiczny, jest opisany i wygląda następująco:źródło
LinkedHashSet
Konstruktory wywołują następujący konstruktor klasy bazowej:Jak widać, wewnętrzna mapa to plik
LinkedHashMap
. Jeśli zajrzysz do środkaLinkedHashMap
, odkryjesz następujące pole:To jest odnośna lista.
źródło
HashSet jest nieuporządkowany i nieposortowany .
LinkedHashSet to zamówiona wersja HashSet.
Jedyna różnica między HashSet i LinkedHashSet jest taka, że:
LinkedHashSet utrzymuje kolejność .
Kiedy iterujemy przez HashSet , kolejność jest nieprzewidywalna, podczas gdy jest przewidywalna w przypadku LinkedHashSet .
Powód, dla którego LinkedHashSet utrzymuje kolejność wstawiania, jest następujący:
Podstawową strukturą danych jest lista podwójnie połączona .
źródło
Należy spojrzeć na źródła
HashSet
konstruktora wywołuje ... jest specjalny konstruktor, który sprawia, że podkład zamiast po prostu .Map
LinkedHashMap
HashMap
źródło
Proponuję używać przez
LinkedHashSet
większość czasu, ponieważ ogólnie ma lepszą wydajność ):HashMap
, ponieważ przez większość czasu używamy struktur Set do iteracji.Możesz zobaczyć źródłową stronę testową tutaj: Przykład końcowego testu wydajności
źródło
HashSet: właściwie Unordered. jeśli przekazanie parametru oznacza
Out Put: może być
2,1,3
nieprzewidywalne. następnym razem kolejne zamówienie.LinkedHashSet()
które produkują Zamówienie FIFO.źródło
HashSet
nie utrzymuj kolejności obsługi elementuLinkedHashSet
reklamowego kolejność elementów reklamowychPrzykład
HashSet
wynikLinkedHashSet
wynikźródło
HashSet:
Podkreślona struktura danych jest Hashtable. Duplikaty obiektów nie są dozwolone. Kolejność wstawiania nie jest zachowywana i jest oparta na kodzie skrótu obiektów. Możliwe jest wstawienie zerowe (tylko raz). Implementuje interfejs Serializable, Clonable, ale nie RandomAccess. HashSet najlepiej wybrać, jeśli częstą operacją jest operacja wyszukiwania.
Konstruktorzy:
LinkedHashSet:
Jest to klasa potomna HashSet. jest dokładnie taki sam jak HashSet, w tym (konstruktory i metody), z wyjątkiem następujących różnic.
Różnice HashSet:
LinkedHashSet:
źródło
Jeśli spojrzysz na konstruktory wywołane z
LinkedHashSet
klasy, zobaczysz, że wewnętrznie jestLinkedHashMap
to używany jako kopia zapasowa.źródło
Wszystkie metody i konstruktory są takie same, ale tylko jedna różnica polega na tym, że LinkedHashset zachowuje kolejność reklam, ale nie zezwala na duplikaty.
Hashset nie będzie obsługiwać żadnych zamówień reklamowych. Jest to proste połączenie List i Set :)
źródło