Comment est la mise en œuvre de LinkedHashMap différente de la table de hachage?
Si LinkedHashMap du temps de la complexité est la même que HashMap la complexité pourquoi avons-nous besoin de table de hachage? Ce sont tous les frais généraux supplémentaires LinkedHashMap par rapport à HashMap en Java?
Vous devez vous connecter pour publier un commentaire.
LinkedHashMap va prendre plus de mémoire. Chaque entrée dans une normale
HashMap
juste a la clé et la valeur. ChaqueLinkedHashMap
entrée a ces références et références à la prochaine et les entrées précédentes. Il y a un peu plus de ménage à faire, même si ce n'est généralement pas pertinent.Vous ne devez pas confondre complexité et les performances. Deux algorithmes ont la même complexité, mais on peut toujours faire mieux que les autres.
Rappelez-vous que
f(N) is O(N)
signifie que:où
C1
etC2
sont des constantes strictement positives. La complexité ne dit rien sur comment petit ou grand laC
valeurs. Pour les deux algorithmes différents, l'une des constantes sera probablement différents.(Et rappelez-vous que big-O complexité est sur le comportement /performance
N
devient très grande. Il vous dit rien sur le comportement /performance pour les petitesN
valeurs).Cela dit, la différence de performance entre
HashMap
etLinkedHashMap
opérations de l'équivalent des cas d'utilisation est relativement faible. Souvent, la mémoire supplémentaire de frais généraux que les plus pertinentes.iteration order = insertion order
par défaut. Alternative Possible à insertion est un accès-ordonnance.LinkedHashMap est utile structure de données lorsque vous avez besoin de savoir l'ordre d'insertion des clés de la Carte. Un cas d'utilisation pour la mise en œuvre d'un cache LRU. En raison de maintien de l'ordre de la LinkedHashMap, la structure de données des besoins de la mémoire supplémentaire par rapport à la table de hachage. Dans le cas où la commande d'insertion n'est pas une obligation, vous devriez toujours aller pour la table de hachage.
Il y a une autre différence majeure entre HashMap et LinkedHashMap :Itération est plus efficace dans le cas de LinkedHashMap.
En tant qu'Éléments dans LinkedHashMap sont connectés avec chaque autre, de sorte itération nécessite du temps proportionnel à la taille de la carte, quelle que soit sa capacité.
Mais dans le cas de HashMap; comme il n'y a pas de commande fixe, de sorte que l'itération sur il faut du temps proportionnel à sa capacité.
J'ai mis plus de détails sur ma blog.
HashMap
ne maintient pas l'ordre d'insertion, donc ne soutient aucune liste doublement chaînée.Plus saillant de
LinkedHashMap
est qu'il maintient l'ordre d'insertion des paires clé-valeur.LinkedHashMap
utilise Liste doublement chaînée pour le faire.Entrée de
LinkedHashMap
ressemble à ceci:Par l'aide avant et après l' - nous garder une trace de l'entrée nouvellement ajoutée dans
LinkedHashMap
, qui nous aide dans le maintien de l'ordre d'insertion.Avant de se reporter à l'entrée et
après se réfère à la prochaine entrée dans
LinkedHashMap
.Pour les schémas et explication étape par étape, veuillez vous référer http://www.javamadesoeasy.com/2015/02/linkedhashmap-custom-implementation.html
LinkedHashMap hérite de la table de hachage, ce qui signifie qu'il utilise de mise en œuvre existantes de la table de hachage pour stocker les clés et les valeurs dans un Nœud (Entrée de l'Objet). Autre que cela, il stocke une distinct liste doublement chaînée de mise en œuvre de maintenir l'ordre d'insertion dans les clés qui ont été entrés.
Il ressemble à ceci :
en-tête de noeud <---> le nœud 1 <---> le nœud 2 <---> le nœud 3 <----> nœud 4 <---> en-tête de nœud.
Supplémentaires de surcharge est le maintien de l'insertion et de la suppression de cette liste doublement chaînée.
Avantage : Itération de l'ordre est garanti d'être en ordre d'insertion, ce qui n'est pas dans la table de hachage.
double-liste liée à transférer le contenu dans un nouveau tableau de tableau.
itérateur.
LinkedHashMap(capacité, loadFactor, accessOrderBoolean) constructeur
est prévu de créer un lien de hachage de la carte dont l'ordre d'itération est
l'ordre dans lequel ses entrées ont été dernier accès, de
moins récemment accédé à la plus récente. Dans ce cas, simplement
l'interrogation de la carte avec get() est une modification structurelle.