Redimensionnement de la table de tableau dans l'implémentation HashMap

Aug 20 2020

Celle-ci est une question simple, pour ceux qui connaissent l'implémentation interne de HashMap :)

La taille initiale est de 16 seaux, le facteur de charge est de 0,75. Cela signifie que lorsqu'il obtient (regardez ce mot) 12, il se redimensionne à 32 compartiments.

Ma question est la suivante: est-il redimensionné de 16 à 32 seaux lorsqu'il obtient 12 paires clé-valeur ou lorsqu'il obtient 12 seaux `` remplis ''? Je demande cela car il peut arriver qu'à partir de ces 16 seaux, les 12 paires clé-valeur soient insérées dans le même seau. Dans ce cas, il serait étrange de redimensionner car les 15 autres sont totalement vides.

Merci, toute opinion à ce sujet serait appréciée :)

Réponses

2 ThRnk Aug 20 2020 at 20:07

Comme mentionné dans ce lien .

Il représente que la 12ème paire clé-valeur de hashmap gardera sa taille à 16. Dès que le 13ème élément (paire clé-valeur) entrera dans le Hashmap, il augmentera sa taille de 2 ^ 4 = 16 buckets par défaut à 2 ^ 5 = 32 seaux.

Indépendamment de l'endroit où chaque clé a été insérée, lorsque le produit du facteur de charge et de la capacité actuelle dépasse, le tableau sera redimensionné.

Le HashMap ne se soucie pas du nombre de compartiments utilisés jusqu'à ce que le facteur de charge soit atteint, il sait que la probabilité d'avoir des collisions devient trop grande et que la carte doit être redimensionnée. Même si de nombreuses collisions se sont déjà produites.

2 AndrewBlagij Aug 20 2020 at 20:03

Depuis JavaDoc https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html#put-K-V-

When the number of entries in the hash table exceeds the product of the load factor and the current capacity, the hash table is rehashed (that is, internal data structures are rebuilt) so that the hash table has approximately twice the number of buckets.

Ainsi, HashMap se redimensionne lorsqu'il a 12 paires clé-valeur. Ce n'est pas étrange, car après le redimensionnement, les entrées changeront leur compartiment.