Comment les valeurs par défaut .equals et .hashCode fonctionneront-elles pour mes classes?

Dis que j’ai ma propre classe

public class MyObj { /* ... */ } 

Il a des atsortingbuts et des méthodes. Il NE DOIT PAS implémenter des équivalents, NE PAS implémenter hashCode.

Une fois que nous appelons les égaux et le hashCode, quelles sont les implémentations par défaut? De la classe d’objects? Et quels sont-ils? Comment fonctionnera le défaut par défaut? Comment le hashCode par défaut fonctionnera-t-il et que renverra-t-il? == va juste vérifier s’ils font référence au même object, donc c’est facile, mais qu’en est-il des méthodes equals () et hashCode ()?

Oui, l’implémentation par défaut est Object (en général, si vous héritez d’une classe qui a redéfini égal et / ou hashCode, vous utiliserez cette implémentation à la place).

De la documentation:

equals

La méthode equals pour la classe Object implémente la relation d’équivalence la plus discriminante possible sur les objects; c’est-à-dire que pour toute valeur de référence non nulle x et y, cette méthode renvoie true si et seulement si x et y se rapportent au même object (x == y a la valeur true).

hashCode

Dans la mesure du possible, la méthode hashCode définie par la classe Object renvoie des entiers distincts pour des objects distincts. (Ceci est généralement implémenté en convertissant l’adresse interne de l’object en un entier, mais cette technique d’implémentation n’est pas requirejse par le langage de programmation JavaTM.)

From Object dans l’une des implémentations JVM:

 public boolean equals(Object object) { return this == object; } public int hashCode() { return VMMemoryManager.getIdentityHashCode(this); } 

Dans les deux cas, il suffit de comparer les adresses mémoire des objects en question.

Il existe des implémentations par défaut de equals() et hashCode() dans Object. Si vous ne fournissez pas votre propre implémentation, celles-ci seront utilisées. Pour equals() , cela signifie une comparaison == : les objects ne seront égaux que s’ils sont exactement le même object. Pour hashCode() , le Javadoc a une bonne explication.

Pour plus d’informations, voir Java, chapitre 3 (pdf), point 8.

Oui, à partir de la classe Object puisque votre classe étend Object implicitement. equals simplement retourne this == obj . hashCode implémentation de hashCode est native. Juste une conjecture – il renvoie le pointeur sur l’object.

Si vous ne fournissez pas votre propre implémentation, une application dérivée de Object sera utilisée. C’est correct, sauf si vous envisagez de placer vos instances de classe dans, par exemple, HashSet (toute collection qui utilise hashCode ()), ou quelque chose qui doit vérifier l’égalité des objects (par exemple, la méthode contains ()). Sinon, cela ne fonctionnera pas correctement si c’est ce que vous demandez.

Il est assez facile de fournir votre propre implémentation de ces méthodes grâce à HashCodeBuilder et EqualsBuilder d’ Apache Commons Lang .

Les développeurs d’IBM ont déclaré:

Sous cette implémentation par défaut, deux références sont égales seulement si elles font référence au même object. De même, l’implémentation par défaut de hashCode () fournie par Object est dérivée en mappant l’adresse mémoire de l’object sur une valeur entière.

Cependant, pour être sûr des détails exacts de l’implémentation de la version Java d’un fournisseur particulier, il est probablement préférable de rechercher la source (si elle est disponible).