So che LinkedHashMap
ha un ordine di iterazione prevedibile (ordine di inserimento). Lo restituito da LinkedHashMap.keySet()
e Collection
restituito da LinkedHashMap.values()
mantiene anche questo ordine?L'ordine è garantito per la restituzione di chiavi e valori da un oggetto LinkedHashMap?
risposta
L'interfaccia Map fornisce tre viste raccolta, che permettono il contenuto di una mappa che essere visti come un insieme di chiavi, insieme di valori, o un insieme di mappature chiave-valore. L'ordine di una mappa viene definita come l'ordine in cui gli iteratori sulla raccolta della mappa visualizzazioni restituiscono i loro elementi. Alcune implementazioni della mappa , come la classe , forniscono specifiche garanzie sul loro ordine, ; altri, come la classe
HashMap
, no.
- Map
Questa lista collegata definisce l'iterazione ordinamento, che normalmente è dell'ordine in cui le chiavi sono state introdotte nel mappa (inserimento ordine).
Quindi, sì, keySet()
, values()
, e entrySet()
(le tre viste di raccolta di cui) i valori restituiti nell'ordine della lista collegata interno utilizza. E sì, il JavaDoc per Map
e LinkedHashMap
lo garantisce.
Questo è il punto di questa classe, dopo tutto.
Guardando all'interfaccia restituisce un semplice Set
e non uno SortedSet
. Quindi non ci sono garanzie.
Prima di assumere una garanzia implicita, cercando in realizzazione (sempre una cattiva idea) anche guardare le implementazioni in tutte le altre implementazioni Java :)
Si potrebbe meglio creare per esempio un TreeSet con il set di tasti nel costruttore .
Guardando più da vicino la documentazione, ci sono davvero garanzie. Come qualcuno ha già scritto, è proprio questo il punto di questa lezione. – glglgl
Guardando alla fonte, sembra che lo faccia. keySet()
, values()
e entrySet()
utilizzano tutti lo stesso ingresso iteratore internamente.
Sarebbe bello avere un collegamento ai repository, ma sono pigro :-) e, naturalmente, non è garanzia di compatibilità diretta. –
AFAIK non è documentato in modo da non poterlo "formalmente" assumere. È improbabile, tuttavia, che l'attuale implementazione cambierebbe.
Se si desidera garantire l'ordine, è possibile eseguire un'iterazione sulle entrate della mappa e inserirle in un set ordinato con una funzione di ordine a scelta, anche se si pagherà un costo di rendimento, naturalmente.
Significa che entrySet() garantisce l'ordine, per keySet() no? – user256239
@kknight: non ne sono sicuro. javadoc afferma: "Questo elenco collegato definisce l'ordine di iterazione, che è normalmente l'ordine in cui le chiavi sono state inserite nella mappa (ordine di inserimento).". Tuttavia, i JavaDocs per JDK sono molto ambigui in generale. – Uri
Se anche entrySet() non garantisce l'ordine di iterazione, qual è la differenza tra LinkedHashMap e HashMap? Come possiamo sfruttare l'ordine di iterazione prevedibile in un'istanza di LinkedHashMap? – user256239
Si può presumere di si. Javadoc dice "ordine di iterazione prevedibile" e gli unici iteratori disponibili in una mappa sono quelli per keySet(), entrySet() e values ().
Quindi in assenza di ulteriori qualifiche è chiaramente inteso applicarsi a tutti quegli iteratori.
Non penso che si possa presumere l'ordine di keySet() e values ().
Posso scrivere facilmente un'implementazione di LinkedHashMap che restituisce un valore non ordinato di keySet() e values (), a condizione che rispetti il contratto di questi due metodi definiti in Map e sovrascritto in HashMap.
L'intero scopo della classe 'LinkedHashMap' è di mantenere l'ordine degli elementi mentre si itera la mappa e questo comportamento è ben specificato. Se scrivi una sottoclasse senza rispettare le specifiche della classe base, stai facendo qualcosa di molto sbagliato. – zakinster
Non confondersi con LinkedHashMap.keySet()
e LinkedHashMap.entrySet()
restituendo Set e quindi non dovrebbe garantire l'ordine!
Set
è un'interfaccia con HashSet
, TreeSet
ecc. Le sue implementazioni. L'implementazione HashSet
dell'interfaccia Set
non garantisce l'ordine. Ma lo fa TreeSet
. Anche LinkedHashSet
fa.
Pertanto, dipende da come Set
è stato implementato in LinkedHashMap
per sapere se il riferimento di Set restituito garantirà l'ordine o meno. Sono andato attraverso il codice sorgente di LinkedHashMap
, sembra che questo:
private final class KeySet extends AbstractSet<K> {...}
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {...}
Così LinkedHashMap/HashMap ha una propria implementazione di Set
cioè KeySet
. Quindi non confondere questo con HashSet
.
Inoltre, l'ordine viene mantenuto dal modo in cui gli elementi vengono inseriti nel bucket. Esaminare il metodo addEntry(..)
di LinkedHashMap
e confrontarlo con quello di HashMap
che evidenzia la differenza principale tra HashMap
e LinkedHashMap
.
Mentre questa risposta presenta sicuramente informazioni utili, in realtà non risponde alla domanda. In pratica si sta dicendo che possono avere un ordine di iterazione prevedibile. – Tuupertunut
- 1. valori di ordinamento e la lista restituzione delle chiavi da dict pitone
- 2. Trasmissione di LinkedHashMap a un oggetto complesso
- 3. Restituzione di un oggetto dal cmdlet PowerShell
- 4. creare un dizionario da array di chiavi e valori
- 5. Java LinkedHashMap mantiene l'ordine delle chiavi?
- 6. Best practice per la restituzione di un errore da una funzione lua che restituisce più valori
- 7. Restituzione di un oggetto locale da una funzione
- 8. È sicuro utilizzare le chiavi "reali" in NSLocalizedString()? Esiste un linguaggio di riserva garantito?
- 9. Comportamento dei keySet di LinkedHashMap() e valori() Metodi
- 10. Equivalente per LinkedHashMap in Python
- 11. Ottenere l'elenco di chiavi e valori da unordered_map
- 12. valori rimozione di default da un oggetto
- 13. lodash/underscore verifica se un oggetto contiene tutte le chiavi/valori di un altro oggetto
- 14. Restituzione di un nuovo oggetto con un altro valore
- 15. Grails: Restituzione di parametri da un taglib
- 16. Recupero di tutti i valori da un oggetto JavaScript
- 17. La restituzione di un oggetto const da una funzione impedisce la costruzione del movimento dall'esterno?
- 18. Un oggetto due chiavi esterne per la stessa tabella
- 19. ottenere i valori per le chiavi all'interno di un intervallo in Java
- 20. equivalente C# di LinkedHashMap
- 21. Restituzione di valori interi da RadioButton in Shiny
- 22. chiavi Converti mappa e valori per array di stringhe
- 23. Inizializzazione un array associativo di valori struct e stringa chiavi
- 24. Restituzione di due o più valori da una funzione
- 25. Implementazione di una LinkedHashMap simultanea
- 26. Usa LinkedHashMap per implementare la cache LRU
- 27. Un ArrayList creato da keySet() di LinkedHashMap conserva l'ordine di inserimento?
- 28. In che modo l'implementazione di LinkedHashMap è diversa da HashMap?
- 29. Merge chiavi array e array di valori in un oggetto in Javascript
- 30. È garantito che False "è 0" e True "è 1"?
Poiché tutte le risposte risolvono il problema di 'values ()' e di 'keySet()', ho ampliato la domanda per includerla. Ciò significa che più domande possono essere chiuse come duplicati di questo. –