2010-01-12 14 views
1

Le hashCode d'un élément java Hashtable est toujours unique?hachage hashable java

Sinon, comment puis-je garantir qu'une recherche me donnera le bon élément?

Répondre

5

Pas nécessairement. Deux objets distincts (et non égaux) peuvent avoir le même hashcode.

+4

Pour répondre à la dernière partie de votre question, HashTable n'utilise pas HashCode pour décider de l'égalité. Il utilise Equals pour décider quoi retourner. Il utilise le HashCode pour réduire les choses à une poignée d'éléments à tester contre Equals. –

0

Idéalement, oui. En réalité, les collisions se produisent parfois.

1

De Java documentation:

Le contrat général de hashCode est:

  • Chaque fois qu'il est invoqué sur le même objet plus d'une fois lors d'une exécution d'une application Java, la La méthode hashCode doit uniformément renvoyer le même nombre entier, à condition qu'aucune information utilisée dans les comparaisons égales sur l'objet ne soit modifiée. Cet entier n'a pas besoin de rester cohérent d'une exécution d'une application à une autre exécution de la même application .

  • Si deux objets sont égaux selon les equals (Object) Méthode , puis en appelant la méthode hashCode sur chacun des deux objets doivent produire le même résultat entier.

  • Il est pas nécessaire que si deux objets sont inégaux selon le procédé equals (java.lang.Object), puis en appelant la méthode hashCode sur chacune des les deux objets doivent produire des résultats entiers distincts. Cependant, le programmeur doit être conscient que la production de résultats entiers distincts pour des objets inégaux peut améliorer les performances des tables de hachage.

Autant que cela est raisonnablement possible, la méthode hashCode définie par la classe objet ne renvoie des entiers distincts pour des objets distincts. (Ceci est généralement mis en œuvre par la conversion l'adresse interne de l'objet dans un entier, mais cette technique de mise en œuvre n'est pas requise par la programmation JavaTM langue.)

Alors oui, vous pouvez généralement attendre la valeur par défaut hashCode pour qu'un objet soit unique. Toutefois, si la méthode a été remplacée par la classe que vous stockez dans le Hashtable, tous les paris sont désactivés.

-1

Le hashCode d'un élément java Hashtable est toujours unique?

Ils devraient. Au moins dans la même classe.

Sinon, comment puis-je garantir qu'une recherche me donnera le bon élément?

En spécifiant votre auto une bonne mise en œuvre hasCode pour votre classe: Override equals() and hashCode

1

Première chose première.
Vous devriez considérer utiliser HashMap au lieu de Hashtable, que celui-ci est considéré comme obsolète (il applique la synchronisation implicite, qui n'est pas nécessaire la plupart du temps. Si vous avez besoin d'un HashMap synchronisé, il est facilement réalisable)

maintenant , concernant votre question.
Cependant, lorsque vous utilisez HashMap (ou Hashtable), le code hachage n'est pas garanti mathématiquement,
cependant, cela n'a pas d'importance.
Si deux clés génèrent le même code de hachage, une valeur égale est automatiquement appelée sur chacune des clés pour garantir que l'objet correct sera récupéré. Mais si vous utilisez une chaîne comme clé, vous êtes sans souci,

Mais si vous utilisez votre propre objet comme clé, vous devez remplacer les méthodes égales et hashCode.
La méthode equals est obligatoire pour le bon fonctionnement de HashMap, tandis que la méthode hashCode doit être codée de sorte que la table de hachage soit relativement éparse (sinon votre hashmap sera juste un long tableau)
Si vous utilisez Eclipse Il existe un moyen facile de générer hashCode et égal, il fait tout le travail pour vous.

+0

Êtes-vous sûr que Eclipse peut générer automatiquement hashCode et est égal? J'en doute, mais peut-être pouvez-vous me prouver le contraire en ajoutant quelques explications à ce sujet. Merci. – sateesh

+0

Faites un clic droit sur l'éditeur, sélectionnez la source dans le menu contextuel -> générer hashCode() et égal à() .. – Sug

+0

Maintenant, je comprends, je ne l'avais jamais utilisé. merci pour votre votre contribution. – sateesh