Hashcode

hasnaa-1 Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -  
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   -
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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   Statut Membre Dernière intervention  
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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