Hashcode

Fermé
hasnaa-1 Messages postés 10 Date d'inscription lundi 20 mai 2013 Statut Membre Dernière intervention 3 janvier 2014 - 17 juin 2013 à 18:42
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 17 juin 2013 à 20:12
Bonjour,

est ce qu'on est oblige de redéfinir hashcode pour utiliser equals

merci d'avance pour vos reponses

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 17/06/2013 à 19:23
Non, ce sont deux choses indépendantes, il est possible d'avoir deux objets avec le même hashCode et qui ne soient pas égaux (c'est même très courant), mais il est également possible d'avoir deux objets égaux qui ont des hashCode différents (mais c'est déconseillé)

Cependant, pour la plupart des traitements, une cohérence entre ces valeurs permet d'optimiser les traitements. En effet si on impose que deux objets égaux aient le même hashCode, alors il est possible d'utiliser le hashCode comme premier test d'égalité (c'est en général un calcul simple), et ne faire la comparaison complète des deux objets (plus coûteuse) que lorsque les hashCode sont identiques.

Il est donc en général intéressant de redéfinir le hashCode avec ces deux propriétés :
1) le hashCode est facile à obtenir (par le calcul, ou précalculé à l'initialisation)
2) deux objets égaux ont le même hashCodeLa confiance n'exclut pas le contrôle
0
hasnaa-1 Messages postés 10 Date d'inscription lundi 20 mai 2013 Statut Membre Dernière intervention 3 janvier 2014
17 juin 2013 à 19:44
mais d'après ce que j'ai lu dans ce document : https://java.developpez.com/faq/java#DIVERS_hashCode
deux objets egaux ils ont forcement le meme hashcode
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
17 juin 2013 à 20:12
Au sens strict, deux objets sont égaux s'ils ont la même référence, c'est à dire que x==y (c'est le seul cas où l'on doit utiliser l'opérateur == ), et c'est ce qui est fait par défaut dans l'implémentation de hashCode de la classe Object (dont hérite toutes les classes).
Donc si tu ne fais pas toi même de surcharge de hashCode, celui-ci correspondra à une égalité au sens strict, ce qui peux être suffisant dans certains cas.
Par contre l'égalité avec la méthode equals correspond à dire x.equals(y), dans ce cas ce sont peut-être deux objets différents, mais c'est leur valeur qui est égale. Dans ce cas il est conseillé d'adapter la méthode hashCode pour que l'égalité du hashCode coïncide avec l'égalité sur la valeur, mais le comportement par défaut sur l'égalité physique reste valable dans quelques cas.
0