web-dev-qa-db-fra.com

Comment default .equals et .hashCode fonctionneront pour mes classes?

Dis que j'ai ma propre classe

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

Il a des attributs et des méthodes. Il ne met pas en œuvre les équivalents, ne met pas en œuvre le hashCode.

Une fois que nous appelons equals et hashCode, quelles sont les implémentations par défaut? De la classe d'objet? Et que sont-ils? Comment fonctionne l'égal par défaut? Comment le hashCode par défaut fonctionnera-t-il et que retournera-t-il? == vérifiera simplement s'ils font référence au même objet, donc c'est facile, mais qu'en est-il des méthodes equals () et hashCode ()?

101
alexeypro

Oui, l'implémentation par défaut est celle de Object (généralement, si vous héritez d'une classe redéfinie égale à/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 objets; c'est-à-dire que pour toute valeur de référence non nulle x et y, cette méthode retourne true si et seulement si x et y font référence au même objet (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 objets distincts. (Ceci est généralement implémenté en convertissant l'adresse interne de l'objet en un entier, mais cette technique d'implémentation n'est pas requise par le langage de programmation JavaTM.)

91
Etienne de Martel

De Object dans l’une des implémentations de la machine virtuelle Java:

public boolean equals(Object object) {
    return this == object;
}

public int hashCode() {
    return VMMemoryManager.getIdentityHashCode(this);
}

Dans les deux cas, il ne s'agit que de comparer les adresses mémoire des objets en question.

46
Brad Mace

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 objets ne seront égaux que s'ils sont exactement le même objet. Pour hashCode(), le Javadoc a une bonne explication.

Pour plus d'informations, voir Effective Java, Chapitre (pdf), élément 8.

10
Jorn

Oui, à partir de Object classe puisque votre classe étend Object implicitement. equals renvoie simplement this == obj. hashCode l'implémentation est native. Juste une supposition - il renvoie le pointeur sur l'objet.

1
khachik

Si vous ne fournissez pas votre propre implémentation, une autre dérivée de Object sera utilisée. C'est OK, sauf si vous envisagez de placer vos instances de classe dans i.e. HashSet (toute collection qui utilise réellement hashCode ()), ou quelque chose qui nécessite de vérifier l'égalité de l'objet (c'est-à-dire la méthode has (HachSet)). 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 à partir de Apache Commons Lang .

1
Paweł Dyda

IBM developerworks dit:

Sous cette implémentation par défaut, deux références ne sont égales que si elles font référence au même objet. 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'objet à une valeur entière.

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

0
brabster