Se la complessità temporale di LinkedHashMap è uguale alla complessità di HashMap, perché abbiamo bisogno di HashMap? Quali sono le overhead extra che LinkedHashMap ha rispetto a HashMap in Java?In che modo l'implementazione di LinkedHashMap è diversa da HashMap?
risposta
LinkedHashMap richiederà più memoria. Ogni voce in un normale HashMap
ha solo la chiave e il valore. Ogni voce LinkedHashMap
ha quei riferimenti e riferimenti alle voci successive e precedenti. C'è anche un po 'di pulizie in più da fare, anche se di solito è irrilevante.
- LinkedHashMap mantiene inoltre un elenco doppiamente collegato che attraversa tutte le sue voci, che fornirà un ordine riproducibile. Questo elenco collegato definisce l'ordine di iterazione, che è normalmente l'ordine in cui le chiavi sono state inserite nella mappa (ordine di inserimento).
- HashMap non ha questi costi aggiuntivi (runtime, spazio) e dovrebbe preferire su LinkedHashMap quando non ti interessa l'ordine di inserimento.
Penso che intenda l'ordine di iterazione? –
@MichaelDeardeuff Hai ragione, ma la risposta è solitamente corretta perché "ordine di iterazione = ordine di inserimento" da parte di sordina. Possibile alternativa a * ordine di inserzione * è un * ordine di accesso *. –
LinkedHashMap è una struttura dati utile quando è necessario conoscere l'ordine di inserimento delle chiavi sulla mappa. Un caso d'uso adatto è per l'implementazione di una cache LRU. A causa del mantenimento dell'ordine di LinkedHashMap, la struttura dei dati richiede memoria aggiuntiva rispetto a HashMap. Nel caso in cui l'ordine di inserimento non fosse un requisito, dovresti sempre scegliere HashMap.
Se la complessità temporale di LinkedHashMap è uguale alla complessità di HashMap, perché è necessario HashMap?
Non si deve confondere la complessità con le prestazioni. Due algoritmi possono avere la stessa complessità, ma uno può costantemente ottenere risultati migliori rispetto agli altri.
Ricorda che f(N) is O(N)
significa che:
C1*N <= limit(f(N), N -> infinity) <= C2*N
dove C1
e C2
sono rigorosamente costanti positive. La complessità non dice nulla su quanto piccoli o grandi siano i valori C
. Per due diversi algoritmi, le costanti saranno probabilmente diverse.
(E ricordate che O-grande complessità è circa il comportamento/performance come N
diventa molto grande. Ti dice nulla circa il comportamento/prestazioni per i piccoli N
valori.)
Detto questo, la differenza di prestazioni tra le operazioni HashMap
e LinkedHashMap
in equivalenti casi d'uso è relativamente piccola. Spesso, le spese generali extra di memoria sono più rilevanti.
Questo è un eccellente insieme di distinzioni da fare. – Jared
C'è un'altra importante differenza tra HashMap e LinkedHashMap: L'iterazione è più efficiente in caso di LinkedHashMap.
come elementi LinkedHashMap sono collegati tra loro in modo iterazione richiede tempo proporzionale alla dimensione della mappa, indipendentemente dalla sua capacità. Ma in caso di HashMap; poiché non esiste un ordine fisso, quindi l'iterazione su di esso richiede tempo proporzionale alla sua capacità.
Ho messo più dettagli sul mio blog.
- Ridimensionamento dovrebbe essere più veloce come un'iterazione sua lista doppio-linked per trasferire il contenuto in una nuova matrice di tabella.
- containsValue() è sovrascritto per sfruttare l'iteratore più veloce.
- LinkedHashMap può anche essere utilizzato per creare una cache LRU. Un costruttore speciale LinkedHashMap (capacity, loadFactor, accessOrderBoolean) viene fornito per creare una mappa hash collegata il cui ordine di iterazione è l'ordine in cui le ultime voci sono state l 'ultimo accesso, da accesso meno recente a più di recente. In questo caso, solo interrogare la mappa con get() è una modifica strutturale.
LinkedHashMap eredita HashMap, ovvero utilizza un'implementazione esistente di HashMap per memorizzare chiavi e valori in un nodo (oggetto voce). Oltre a ciò, memorizza un'implementazione separata con un elenco a doppia connessione per mantenere l'ordine di inserimento in cui sono state immesse le chiavi.
Sembra che questo:
nodo intestazione < ---> nodo 1 < ---> nodo 2 < ---> nodo 3 < ----> nodo 4 < ---> intestazione nodo.
Un ulteriore sovraccarico consente di mantenere l'inserimento e la cancellazione in questa lista doppiamente collegata. Il vantaggio è: L'ordine di iterazione è garantito come ordine di inserzione, che non è in HashMap.
HashMap
non mantiene l'ordine di inserzione, quindi non mantiene alcuna lista doppiamente collegata.
La caratteristica più saliente di LinkedHashMap
è che mantiene l'ordine di inserimento delle coppie chiave-valore. LinkedHashMap
utilizza l'Elenco collegato doppiamente per farlo.
Ingresso di LinkedHashMap
assomiglia a questo:
static class Entry<K, V> {
K key;
V value;
Entry<K,V> next;
Entry<K,V> before, after; //For maintaining insertion order
public Entry(K key, V value, Entry<K,V> next){
this.key = key;
this.value = value;
this.next = next;
}
}
Utilizzando prima e dopo - teniamo traccia di voce appena aggiunta in LinkedHashMap
, che ci aiuta a mantenere ordine di inserimento.
Prima di fare riferimento alla voce precedente e dopo si riferisce alla voce successiva in LinkedHashMap
.
Schemi e spiegazione passo passo si veda http://www.javamadesoeasy.com/2015/02/linkedhashmap-custom-implementation.html
- 1. In che modo una chiusura è diversa da una richiamata?
- 2. Prestazioni HashMap vs LinkedHashMap in iterazione su valori()
- 3. LinkedHashMap firma
- 4. In che modo la nozione di statica di Java è diversa da quella di C#?
- 5. In che modo la profilatura è diversa dalla registrazione?
- 6. In che modo Mesa è diversa dai driver OpenGL?
- 7. Accesso a una HashMap da una diversa classe
- 8. Ottieni il primo elemento di linkedhashmap
- 9. Informazioni su acessOrder LinkedHashMap Implementazione in java
- 10. Shrink LinkedHashMap in Java
- 11. equivalente C# di LinkedHashMap
- 12. In che modo un thread creato da un'app può essere considerato un'app diversa da ContentProvider dell'app?
- 13. In che modo la modalità di sistema ARM è diversa dalla modalità di supervisione braccio?
- 14. Ottieni l'elemento successivo in LinkedHashMap?
- 15. In che modo una tabella a campi incrociati di Pandas è diversa da un pivot_table di Pandas?
- 16. Equivalente per LinkedHashMap in Python
- 17. Perché la classe LinkedHashMap implementa l'interfaccia Mappa?
- 18. Implementazione di una LinkedHashMap simultanea
- 19. serialize/deserialize a LinkedHashMap (android) java
- 20. Che cos'è esattamente il bucket in hashmap?
- 21. EL ottenere il valore di un HashMap da Integer chiave
- 22. In che modo la programmazione reattiva è diversa dalla programmazione basata sugli eventi?
- 23. In che modo l'implementazione del DOM virtuale è diversa da createDocumentFragment() se non viene osservato nessuno stato?
- 24. Valore mutabile predefinito da HashMap
- 25. LinkedHashMap emissione ordine
- 26. Prestazioni di HashMap con diversa capacità iniziale e fattore di carico
- 27. Impostare campi oggetto da HashMap
- 28. In che modo Object.prototype.toString.apply (valore) è diverso da value.toString()?
- 29. In che modo RFC 5545 è diverso da RFC 2445
- 30. In che modo ArrayListMultimap è diverso da LinkedListMultimap?
Di conseguenza, il rendimento è leggermente inferiore rispetto a quello di HashMap. – Snehal
@Jon Skeet E 'come se i valori nel caso in cui LinkedHashMap fosse costituito da riferimenti aggiuntivi al valore precedente e successivo, la cancellazione o l'inserimento di qualsiasi elemento richiederebbe anche un costo aggiuntivo per la riconnessione? Sarebbe bello se ottengo l'implementazione completa o ha un link o spiegato. –
@Passionate programmatore: il codice sorgente è pubblicamente disponibile - perché non guardare lì? E sì, l'inserimento e la cancellazione richiedono l'aggiornamento dell'elenco collegato. –