Equals et Hashcode
Generality
Equals et Hashode are used for data structure
Equality
- == : Compare the value of 2 expressions
equals : Can be overwritten
l’opérateur == compare les valeurs des types primitifs (int, long, char, etc).
Utilisé entre deux objets, ce sont les adresses des références qui sont comparées, ce qui implique que l’utilisation de == sur deux instances distinctes sémantiquement équivalentes retournera false.
redéfinir en respectant les règles suivantes : l’implémentation doit être
- reflexive,
- symétrique,
- transitive,
- cohérente,
Method equals()
Defined in java.lang.Object Class
1
2
3public boolean equals(Object obj) {
return this == obj;
}héritée par tous les objects
Il est nécessaire de redefinir la méthode equals dans les objets pour valider le comportement d’égalité de l’objet
1 |
|
Dans la classe String, equals a déjà été redefini, dans StringBuilder non, mais String et StringBuilder sont différents en tant qu’Objet
La majorité des classes java ne redéfinisse pas la méthode equals()
Seuls les types immuables redéfinissent la méthode equals() (String, Wrapper de primitive…)
Attention en Java8
1 |
|
Hashcode
Valeur de haschage (entier signé de 32 bits)
important pour les performances des tables de hashages et structure de données.
Cette valeur de hachage est utilisée par d’autres codes lors du stockage ou de la manipulation de l’instance - les valeurs visent à être réparties de manière homogène pour différentes entrées de manière à être utilisées en agglomération. Cette propriété est importante pour les performances des tables de hachage et autres structures de données qui stockent des objets en groupes (“agglomérats”) en fonction de leurs valeurs de hachage.
- deux objets pour lesquels la méthode equals() renvoie true doivent renvoyer la même valeur de hachage
Ce qu’il se produit ici est que les Hash(Map|Set) classent les objets dans un histogramme basé sur le hashCode. A l’instar d’equals, le hashCode par défaut de Hotspot convertit l’adresse en entier et donc retourne des valeurs différentes pour des objets différents. Les méthodes des hash collections utilisent la valeur du hashCode pour localiser un objet dans l’histogramme et si celui-ci ne contient pas cet entier, alors il est considéré que l’objet ne figure pas dans la collection. Deuxième effet kiss kool : puisque deux objets distincts mais sémantiquement égaux ont des hashCode différents, alors ils sont rangés dans des buckets différents impliquant le stockage de doublons, ce qui est en rupture avec le contrat de base du Set.
redéfinir hashCode de concert avec equals est primordial. Mais qu’est ce que le hashCode ? Simplement une réduction d’un objet sous forme de valeur entière. L’implémentation doit être cohérente avec equals : deux objets égaux doivent présenter le même hashcode, en revanche il n’est pas requis que deux objets ayant le même hashCode soient forcément égaux,