Wiem, że LinkedHashMap
ma przewidywalną kolejność iteracji (kolejność reklamowa). Czy Set
zwracane przez LinkedHashMap.keySet()
i Collection
zwracane przez LinkedHashMap.values()
klienta również utrzymują to zamówienie?
java
iteration
linkedhashmap
user256239
źródło
źródło
values()
, a takżekeySet()
, mam pytanie rozszerzony obejmuje to. Oznacza to, że więcej pytań można zamknąć jako duplikaty tego.Odpowiedzi:
- Mapa
- LinkedHashMap
Tak, tak
keySet()
,values()
, ientrySet()
(trzy widoki kolekcja wspomniano) wartości zwracane w kolejności wewnętrznych związanych zastosowań listy. I tak, JavaDocMap
iLinkedHashMap
gwarantuje to.W końcu o to chodzi w tej klasie.
źródło
Collection
jest po prostu klasą bazową zwracanych wartości (). Implementacja kolekcji, którą zwraca, jest nadal kontrolowana przezLinkedHashMap
. W tymLinkedHashMap
przypadku zwracaLinkedValues
instancję, prywatną klasę wewnątrz LinkedHashMap.java.Map
), która wyraźnie wiąże kolejność mapy z iteratorami w widokach kolekcji mapy (i wyjaśnienie, czym są te widoki kolekcji). To był dla mnie brakujący element.Patrząc na źródło, wygląda na to, że tak.
keySet()
,values()
ientrySet()
wszystkie używają wewnętrznie tego samego iteratora wpisu.źródło
Nie daj się mylić z
LinkedHashMap.keySet()
iLinkedHashMap.entrySet()
powracającego ustawiony i dlatego nie powinny gwarantować zamawiania!Set
Jest to interfejsHashSet
,TreeSet
itp istoty jego implementacje.HashSet
ImplementacjaSet
interfejsu nie gwarantuje uporządkowanie. AleTreeSet
tak. TeżLinkedHashSet
.W związku z tym zależy to od tego, w jaki sposób
Set
zostało zaimplementowane,LinkedHashMap
aby wiedzieć, czy zwracane odniesienie do zestawu zagwarantuje zamówienie, czy nie. Przejrzałem kod źródłowyLinkedHashMap
, wygląda to tak:Zatem LinkedHashMap / HashMap ma własną implementację
Set
tjKeySet
. Dlatego nie myl tego zHashSet
.Kolejność jest również utrzymywana przez sposób wkładania elementów do wiadra. Spójrz na
addEntry(..)
metodęLinkedHashMap
i porównaj ją z tą,HashMap
która podkreśla główną różnicę międzyHashMap
iLinkedHashMap
.źródło
Możesz tak założyć. Javadoc mówi „przewidywalna kolejność iteracji”, a jedynymi dostępnymi iteratorami na mapie są te dla keySet (), entrySet () i values ().
Tak więc w przypadku braku dalszych zastrzeżeń, jest to wyraźnie przeznaczone do zastosowania do wszystkich tych iteratorów.
źródło
AFAIK nie jest to udokumentowane, więc nie można tego "formalnie" założyć. Jest jednak mało prawdopodobne, aby obecna implementacja uległa zmianie.
Jeśli chcesz zapewnić porządek, możesz iterować po wpisach mapy i wstawić je do posortowanego zestawu z wybraną funkcją kolejności, chociaż oczywiście będziesz płacić za wydajność.
źródło
Patrząc na interfejs, zwraca zwykły,
Set
a nie plikSortedSet
. Więc nie ma żadnych gwarancji.Przed założeniem niejawnej gwarancji, patrząc na implementację (zawsze zły pomysł), spójrz także na implementacje we wszystkich innych implementacjach Java :)
Możesz lepiej utworzyć na przykład TreeSet z zestawem kluczy w konstruktorze.
źródło
Nie sądzę, aby można było założyć kolejność keySet () i wartości ().
Mogę łatwo napisać implementację LinkedHashMap, która zwraca ci unordered keySet () i values (), o ile trzymam się kontraktu tych dwóch metod, które są zdefiniowane w Map i nadpisane w HashMap.
źródło
LinkedHashMap
klasy jest zachowanie kolejności elementów podczas iteracji mapy, a to zachowanie jest dobrze określone. Jeśli piszesz podklasę bez przestrzegania specyfikacji klasy bazowej, robisz coś bardzo złego.