HashMap
contient un certain nombre de compartiments. Il utilise hashCode
pour déterminer le seau à les mettre en. Pour des raisons de simplicité l'imaginer comme un module.
Si notre hashcode est 123456 et nous avons 4 seaux, 123456 % 4 = 0
afin que l'élément va dans le premier seau, Seau de 1.
Si notre hashcode de la fonction est bonne, il doit fournir une répartition uniforme de sorte que tous les compartiments sera utilisé un peu aussi. Dans ce cas, le seau utilise une liste liée à stocker les valeurs.
Mais vous ne pouvez pas compter sur les gens pour mettre en place les bonnes fonctions de hachage. Les gens vont souvent écrire des pauvres des fonctions de hachage qui aboutira à un non-même de la distribution. Il est également possible que nous pourrions juste pas de chance avec nos entrées.
La encore moins de cette distribution est, plus nous avançons en O(1) opérations et plus nous nous dirigeons vers O(n) opérations.
La mise en œuvre de la Hashmap tente d'atténuer ce, par l'organisation de certains compartiments des arbres plutôt que des listes liées si les seaux devient trop grand. C'est ce qu' TREEIFY_THRESHOLD = 8
est pour. Si un seau contient plus de huit éléments, il devrait devenir un arbre.
C'est un arbre Rouge-Noir arbre. Il est tout d'abord triés par code de hachage. Si le hash codes sont les mêmes, il utilise l' compareTo
méthode de Comparable
si les objets à implémenter cette interface, sinon l'identité de code de hachage.
Si les entrées sont supprimées de la carte, le nombre d'entrées dans le seau peut réduire, de sorte que cette structure de l'arbre n'est plus nécessaire. C'est ce que l' UNTREEIFY_THRESHOLD = 6
est pour. Si le nombre d'éléments dans un seau descend au-dessous de six, nous pourrions aussi bien aller en arrière à l'aide d'une liste liée.
Enfin, il y a l' MIN_TREEIFY_CAPACITY = 64
.
Lorsqu'un hachage de la carte augmente en taille, il redimensionne automatiquement pour avoir plus de seaux. Si nous avons une petite carte de hachage, le risque de nous arriver très seaux pleins est assez élevé, parce que nous n'avons pas qui ont de nombreux compartiments différents pour mettre des trucs dans. C'est beaucoup mieux d'avoir un plus gros hachage de la carte, avec plus de seaux qui sont moins complète. Cette constante indique fondamentalement de ne pas commencer à faire des seaux dans les arbres si notre hash map est très petite, il devrait redimensionner à être plus première place.
Pour répondre à votre question au sujet de le gain de performance, ces optimisations ont été ajoutés pour améliorer le pire des cas. Je ne fais que spéculer, mais vous auriez probablement seulement voir une notable amélioration de la performance en raison de ces optimisations si votre hashCode
fonction n'était pas très bonne.
Les Images sont à moi (merci MSPaint). De les réutiliser comme bon vous semble.