Que se passe-t-il si deux objets différents ont le même hashcode?
C'est ma compréhension que deux inégale les objets peuvent avoir la même hashcode. Comment cela peut-il être traitées lors de l'ajout ou de la récupération à partir d'une table de hachage java?
source d'informationauteur Joey
Vous devez vous connecter pour publier un commentaire.
Ils vont tout simplement être ajouté à la même seau et
equals()
sera utilisé pour les distinguer.Chaque compartiment peut contenir une liste d'objets avec le même code de hachage.
En théorie, vous pouvez revenir par le même entier comme un code de hachage pour n'importe quel objet de la classe donnée, mais cela voudrait dire que vous perdez tous les avantages de performance de la valeur de hachage de la carte et, en effet, permettra de stocker des objets dans une liste.
Dans la table de hachage, les clés ainsi que leurs valeurs associatives sont stockés dans une liste liée nœud dans le seau et les touches sont essentiellement comparé dans la table de hachage utilisant la méthode equals() de ne pas en hashcode.
a.equals(b)
retournetrue
bValue
remplaceraaValue
etbValue
sera retourné.a.equals(b)
retournefalse
un autre nœud sera créé dans la liste de seau, de sorte que lorsque vous appelezget("b")
vous obtiendrezbValue
depuisa.equals(b)
estfalse
.HashMap est de travailler sur le concept de hachage et indexation.
En interne HashMap stocke les valeurs dans le Tableau de Nœuds.
Chaque nœud se comporte comme LinkedList.
Chaque nœud de la liste liée de 4 valeurs :
int hash
K key
V value
Node<K, V> next
HashMap structure Interne:
Lors de l'insertion de la valeur dans la table de hachage, premier hashcode de la Clé est générée et basée sur un Algorithme, il va calculer l'indice.
Donc notre valeur à stocker dans l'index spécifique avec hashcode, clé, valeur et l'adresse de l'élément suivant.
Lors de la récupération de la valeur de la table de hachage, premier hashcode va générer puis de l'index(de la même manière qu'au moment de l'insertion). Lors de l'obtention de la valeur de l'indice, d'abord, il va vérifier pour hashcode, si hashcode correspondra alors seulement il va vérifier pour la clé à partir d'un Nœud à l'aide de méthode equals.
Si la clé de match, alors seulement il sera de retour la valeur ou bien il va vérifier pour le prochain Nœud avec le même hashcode.
Dans ce cas, vous pourriez utiliser IdentityHashMap, où les différents objets avec le même hash sont considérés comme différents basé sur leurs identités.
Lorsque deux inégale objets ont la même valeur de hachage, ce qui provoque une collision dans la table de hachage, parce que les deux objets veux être dans le même logement (parfois appelé un seau). L'algorithme de hachage doit résoudre de telles collisions. Remontant dans la décoloration des souvenirs de mon collège algorithmes sûr, je me souviens de trois principales façons de le faire:
Je pense que le Java de hachage classes d'utiliser la troisième méthode, mais ils peuvent utiliser une combinaison de l'approche. La clé d'un bon hachage est bien pour assurez-vous que la table de hachage a une assez grande capacité et à écrire de bonnes fonctions de hachage. Une table de hachage qui n'a que le nombre de compartiments que les objets qu'il vont probablement avoir des conflits. Habituellement, vous voulez que la table de hachage pour être environ deux fois plus grand que le nombre d'objets qu'il stocke. Java est HashMap va grandir en tant que de besoin, mais vous pouvez lui donner une capacité de démarrage et le facteur de charge si vous le souhaitez.
De la fonction de hachage est au programmeur. Vous pouvez simplement retourner 0 pour tous les objets, mais que signifie le hachage (à la fois de stockage et de récupération) deviendra O(n) au lieu de O(1) ... ou en termes simples, il sera chien lent.
Référence : http://www.coderanch.com/t/540275/java/java/objects-hashcode-HashMap-retrieve-objects