Tandis que les autres réponses expliquer ce qui se passe, OP commentaires sur les réponses m'amène à penser un angle différent d'explication est nécessaire.
Exemple simplifié
Disons que vous allez jeter de 10 chaînes dans un tableau associatif: "A", "B", "C", "Bonjour", "au Revoir", "Yo", "Yo-yo", "Z", "1", "2"
Vous utilisez HashMap
que votre hash map au lieu de faire votre propre carte de hachage (bon choix). Une partie de la substance au-dessous de ne pas utiliser HashMap
mise en œuvre directement mais il approche de l'une plus théorique et du point de vue abstrait.
HashMap
n'est pas par magie savez que vous allez à ajouter 10 chaînes, et il ne sait quelles chaînes de caractères, vous allez mettre en il plus tard. Elle a à offrir des places de mettre ce que vous pourriez donner à elle... pour tout ce qu'elle sait que vous allez mettre de 100 000 chaînes en elle - peut-être de chaque mot dans le dictionnaire.
Disons que, en raison de l'argument du constructeur que vous avez choisi lors de votre prise de new HashMap(n)
que votre hash map a 20 seaux. Nous appelons bucket[0]
par bucket[19]
.
map.put("A", value);
Disons que la valeur de hachage pour "A" est de 5. Le hachage de la carte peut maintenant faire bucket[5] = new Entry("A", value);
map.put("B", value);
Supposer de hachage("B") = 3. Donc, bucket[3] = new Entry("B", value);
map.put("C"), value);
- de hachage("C") = 19 - bucket[19] = new Entry("C", value);
map.put("Hi", value);
Maintenant, voici où cela devient intéressant. Disons que votre fonction de hachage est telle que de hachage("Bonjour") = 3. Alors maintenant, hash map veut faire bucket[3] = new Entry("Hi", value);
Nous avons un problème! bucket[3]
est où nous avons mis la touche "B", et "Salut" est certainement une touche autre que "B"... mais ils ont la même valeur de hachage. Nous avons une collision!
En raison de cette possibilité, l' HashMap
n'est pas réellement mise en œuvre de cette façon. Un hachage de la carte doit avoir des seaux qui peut contenir plus de 1 entrée en eux. NOTE: je n'ai pas à en dire plus que 1 entrée avec la même clé, comme nous ne peut pas, mais il doit avoir des seaux qui peut contenir plus de 1 entrée de clés différentes. Nous avons besoin d'un seau qui peut contenir à la fois "B" et "Salut".
Afin de ne pas laisser n' bucket[n] = new Entry(key, value);
, mais au lieu de cela, nous allons avoir bucket
être de type Bucket[]
au lieu de Entry[]
. Alors maintenant, nous n' bucket[n].add( new Entry(key, value) );
Donc, nous allons changer de...
bucket[3].add("B", value);
et
bucket[3].add("Hi", value);
Comme vous pouvez le voir, nous avons maintenant les entrées pour "B" et "Salut" dans le même seau. Maintenant, lorsque nous voulons obtenir de nouveau, nous avons besoin d'une boucle sur tout dans le seau, par exemple, avec une boucle for.
Donc, la boucle est présent à cause des collisions. Pas de collisions de key
, mais les collisions d' hash(key)
.
Pourquoi utilisons-nous tel un fou de la structure de données?
Vous demandez peut-être à ce stade, "Attendez, QUOI!?! Pourquoi pourrait-on faire une telle chose bizarre comme ça??? Pourquoi sommes-nous à l'aide de ces artificiel, et alambiqué structure de données???" La réponse à cette question serait...
Un hachage carte fonctionne comme ceci en raison des propriétés qu'un tel particulier le programme d'installation fournit pour nous en raison de la façon dont les mathématiques fonctionne. Si vous utilisez une bonne fonction de hachage, ce qui minimise les conflits, et si vous la taille de votre HashMap
ont plus de seaux que le nombre d'entrées que vous devinez sera en elle, alors vous avez une optimisation de hachage de la carte qui sera le plus rapide de la structure de données pour les insertions et les requêtes de données complexes.
Votre table de hachage peut être trop petit
Puisque vous dites que vous êtes souvent en voyant cette boucle for être itéré avec plusieurs éléments de votre débogage, ce qui signifie que votre HashMap
pourrait être trop petit. Si vous avez un délai raisonnable deviner combien de choses que vous pourriez mettre en elle, essayez de régler la taille plus grande que celle. Avis dans mon exemple ci-dessus que j'ai été insertion de 10 chaînes, mais avait une table de hachage avec carte de 20 seaux. Avec une bonne fonction de hachage, cela vous donnera de très peu de collisions.
Note:
Remarque: l'exemple ci-dessus est une simplification de la question et de ne prendre certains raccourcis pour des raisons de concision. Une explication complète est même un peu plus compliqué, mais tout ce que vous devez savoir pour répondre à la question posée est ici.