Collections Java - hashCode () et equals () - Comment remplacer les méthodes equals () et hashcode () en Java ?

Publié: 2018-08-08
Collections Java hashCode et égal

equals() et hashCode() en Java sont deux méthodes fondamentales qui sont déclarées dans la classe Object et la partie ou la bibliothèque Java principale.

Si vous avez l'une des préoccupations ci-dessous en Java, vous êtes au bon endroit.

  • Pratiques Java -> Implémentation de equals
  • override - Remplacer equals et hashCode en Java
  • Comment remplacer la méthode equals () en Java
  • Comment remplacer la méthode hashCode () en Java
  • Comment remplacer les méthodes equals et hashCode en Java
  • Comment et pourquoi remplacer la méthode equals en Java
  • Pourquoi toujours remplacer hashcode() si le remplacement est égal à() ?

Examinons un exemple simple pour comprendre d'abord l'égalité de Reference Equality et Logical Equality . L'opérateur d'égalité (==) compare les références (adresses en mémoire) des deux chaînes comme deux nombres différents - c'est ce qu'on appelle l' Reference equality .

Logical equality compare les données des objets au lieu de la valeur des références.

Sortir:

hashCode et equals sont étroitement liés :

  • si vous remplacez equals , vous devez remplacer hashCode .
  • hashCode doit générer des valeurs égales pour des objets égaux.
  • equals et hashCode doivent dépendre du same set of significant fields . Vous devez utiliser le même ensemble de champs dans ces deux méthodes. Vous n'êtes pas obligé d'utiliser tous les champs. Par exemple, un champ calculé qui dépend d'autres devrait très probablement être omis de equals et hashCode .

Lors de l'implémentation de equals , les champs sont comparés différemment, selon leur type :

  • champs d'objet, y compris les collections : utilisez égal
  • énumérations de type sécurisé : utilisez soit equals soit == (ils reviennent au même, dans ce cas)
  • champs d'objet éventuellement nuls : utilisez à la fois == et égal
  • champs de tableau : utilisez Arrays.equals
  • champs primitifs autres que float ou double : utilisez ==
  • float : convertir en int en utilisant Float.floatToIntBits , puis utilisez ==
  • double : convertir en long en utilisant Double.doubleToLongBits , puis utiliser ==

Implémentation de hashCode :

  • si une classe remplace equals , elle doit remplacer hashCode
  • lorsqu'ils sont tous les deux remplacés, equals et hashCode doivent utiliser le même ensemble de champs
  • si deux objets sont égaux, alors leurs valeurs hashCode doivent également être égales
  • si l'objet est immuable, alors hashCode est un candidat pour la mise en cache et l'initialisation paresseuse

C'est une idée fausse très répandue que hashCode fournit un identifiant unique pour un objet. Ce ne est pas.

Par contrat général, la méthode equals() en Java doit être réflexive, symétrique, transitive, cohérente et toute référence non nulle doit renvoyer false. En d'autres termes, pour des valeurs arbitraires de a, b et c, les tests suivants doivent toujours réussir :

Pour la meilleure pratique, utilisez les étapes ci-dessous pour implémenter votre méthode equals() :

  • Utilisez this == that pour vérifier l'égalité des références
  • Utilisez instanceof pour tester le type d'argument correct
  • Transmettez l'argument au type correct
  • Comparer les champs significatifs pour l'égalité

Voici un exemple complet.

CrunchifyImplementEqualsHashCode.java

Sortie de la console Eclipse :