Esiste una differenza di prestazioni tra HashMap
e LinkedHashMap
per attraversare la funzione values()
?Prestazioni HashMap vs LinkedHashMap in iterazione su valori()
risposta
penso che il LinkedHashMap
deve essere più veloce in attraversamento a causa di un nextEntry
implementazione superiore nella sua Iterator
Ecco perché:
andiamo passo dopo passo dal values
implementazione.
La HashMap
attuazione del values
è questo:
public Collection<V> values() {
Collection<V> vs = values;
return (vs != null ? vs : (values = new Values()));
}
Il LinkedHashMap
estende da HashMap
e eredita la stessa implementazione.
La differenza è nell'implementazione Iterator
per il Values
in entrambi.
per HashMap
si estende da java.util.HashMap.HashIterator
private final class ValueIterator extends HashIterator<V> {
public V next() {
return nextEntry().value;
}
}
ma per LinkedHashMap
si estende da java.util.LinkedHashMap.LinkedHashIterator
private class ValueIterator extends LinkedHashIterator<V> {
public V next() { return nextEntry().value; }
}
così la differenza riduce essenzialmente a nextEntry
attuazione.
Per LinkedHashMap
è solo chiamando e.after dove e è la Entry
, ma per HashMap
c'è qualche lavoro coinvolti nella attraversando la matrice Entry[]
per trovare il prossimo successiva.
UPDATE: Codice per nextEntry()
in HashMap
final Entry<K,V> nextEntry() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
Entry<K,V> e = next;
if (e == null)
throw new NoSuchElementException();
if ((next = e.next) == null) {
Entry[] t = table;
while (index < t.length && (next = t[index++]) == null)
;
}
current = e;
return e;
}
La Voce [] non è un negozio attiguo. (Ci potrebbero essere valori nulli in mezzo). Se date un'occhiata al codice sopra, ciò che fa è puntare vicino a corrente e trovare il prossimo dopo iterando sopra la voce [].
Ma Penso che questo guadagno di prestazioni arriverà al costo dell'inserimento.Guarda il metodo addEntry
in entrambe le classi come esercizio.
Il miglior consiglio sarebbe "Non aver paura di provarlo", ma sono abbastanza sicuro che siano molto simili. Getter per il set di valori è O (1) e quindi ogni passo iteratore. L'iterazione attraverso una lista concatenata è tanto banale quanto l'iterazione attraverso i bucket hash, con un possibile piccolo vantaggio in favpr dell'elenco collegato.
Quasi non importa. La domanda è: cosa ti serve? Se l'ordine degli elementi è rilevante, è necessario utilizzare LinkedHashMap
. Altrimenti non ne hai bisogno, quindi usa HashMap
.
Ho provato in un test unitario, valori ripetuti() 10000 volte, i millisecondi: 806 vs 902. È quasi la stessa cosa.
Sì, ci sarà la stessa differenza di prestazioni come si ottiene in tutte le iterazioni su HashMap
contro LinkedHashMap
: HashMap
vorrà del tempo proporzionale al numero di voci più la dimensione della tabella hash, e LinkedHashMap
vorrà solo tempo proporzionale il numero di voci.
Ho scritto un piccolo programma di creazione di profili creando 1 milione di chiavi (numero intero) vs Booleano.TRUE, ripetendo 100 volte. Trovato il seguente:
HashMap:-
Create: 3.7sec
Iterate: 1.1sec
Access: 1.5sec
Total: 6.2sec
LinkedHashMap:-
Create: 4.7sec (30% slower)
Iterate: 0.5sec (50% faster)
Access: 0.8sec (50% faster)
Total : 6.0sec
garbage collection non fatto inquina i numeri un po ', ma penso che LinkedHashMap ha il vantaggio rispetto HashMap e userò che nel codice futuro.
- 1. Prestazioni dichiarazione HashMap vs Switch
- 2. Iterazione su hashmap in JSP nell'applicazione struts
- 3. Iterazione su una HashMap di HashMaps in Java (o Scala)
- 4. In che modo l'implementazione di LinkedHashMap è diversa da HashMap?
- 5. Informazioni su acessOrder LinkedHashMap Implementazione in java
- 6. Shrink LinkedHashMap in Java
- 7. LinkedHashMap firma
- 8. WeakHashMap vs HashMap
- 9. Iterazione vs concatenazione elenco
- 10. Equivalente per LinkedHashMap in Python
- 11. Java: HashSet vs. HashMap
- 12. Ottieni il primo elemento di linkedhashmap
- 13. LinkedHashMap emissione ordine
- 14. copy.copy vs prestazioni copy.deepcopy su tuple
- 15. scala hashmap valori multipli
- 16. Scala Map vs HashMap
- 17. Iterazione su una raccolta in Swift: var vs let
- 18. Comprensioni: più valori per iterazione
- 19. iterazione di mappa in Freemarker
- 20. Prestazioni VS scadenti - CPU alta su IsAssertEtwEnabled
- 21. Prestazioni JPG vs WebP su Android
- 22. Bit vettoriale vs elenco di valori booleani prestazioni
- 23. Come memorizzare HashMap su Android?
- 24. Iterator su HashMap in Java
- 25. Perché la classe LinkedHashMap implementa l'interfaccia Mappa?
- 26. Prestazioni SQL IN() vs. INTERNO performance
- 27. SQL JOIN vs IN prestazioni?
- 28. Iterazione su un tratto sigillato in Scala?
- 29. L'ordine è garantito per la restituzione di chiavi e valori da un oggetto LinkedHashMap?
- 30. equivalente C# di LinkedHashMap
potresti per favore elaborare o modificare questa frase '" ma per HashMap c'è del lavoro nel traversare l'array Entry [] per trovare il prossimo. "' – exexzian
@sansix ha aggiunto un aggiornamento. –
+1 per la risposta aggiornata ora, è molto più chiaro – exexzian