104 votes

Comment par défaut .d'égal à égal et .hashCode de travail pour mes cours?

Dire que j'ai ma propre classe

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

Il a des attributs et des méthodes. Il NE met PAS en œuvre d'égal à égal, NE PAS mettre en œuvre hashCode.

Une fois que nous appelons equals et hashCode, ce sont les implémentations par défaut? À partir de la classe d'Objet? Et quels sont-ils? Comment la valeur par défaut est égale à? Comment la valeur par défaut hashCode qui fonctionne et ce qui sera de retour? == il suffit de vérifier si elles font référence au même objet, il est donc facile, mais qu'en est equals() et hashCode() méthodes?

93voto

Etienne de Martel Points 16020

Oui, l'implémentation par défaut est l'Objet (de manière générale; si l'on hérite d'une classe qui a redéfini d'égal à égal et/ou hashCode, vous utiliserez ensuite que la mise en œuvre à la place).

À partir de la doc:

est égal à:

La méthode equals de la classe de l'Objet met en œuvre le plus discriminant possible relation d'équivalence sur les objets; c'est, pour tout non-nulles de référence les valeurs de x et y, cette méthode retourne true si et seulement si x et y désignent le même objet (x == y a la valeur true).

hashCode:

Autant qu'il est raisonnablement pratique, le hashCode de la méthode définie par la classe de l'Objet n'retour distincts entiers pour des objets distincts. (Ce qui est généralement mis en œuvre par la conversion de l'adresse interne de l'objet en entier, mais cette mise en œuvre technique n'est pas exigée par la Java langage de programmation.)

48voto

Brad Mace Points 12173

D' Object dans celui de la JVM implémentations:

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

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

Dans les deux cas, c'est juste en comparant les adresses de la mémoire des objets en question.

10voto

Jorn Points 5202

Il existe des implémentations par défaut de equals() et hashCode() dans l'Objet. Si vous n'avez pas à fournir votre propre mise en œuvre, ceux-ci seront utilisés. Pour equals(), ce qui signifie une == comparaison: les objets ne seront égales si elles sont exactement le même objet. Pour hashCode(), la Javadoc a une bonne explication.

Pour plus d'informations, voir Efficace Java, Chapitre 3 (pdf), point 8.

1voto

khachik Points 12589

Oui, à partir de Object classe depuis votre classe étend Objet implicitement. equals simplement les retours this == obj. hashCode mise en œuvre est originaire. Juste une supposition - il retourne le pointeur vers l'objet.

1voto

Paweł Dyda Points 10049

Si vous ne fournissez pas votre propre mise en œuvre, un dérivé de l'Objet serait utilisé. C'est OK, sauf si vous envisagez de mettre votre instances de classe en savoir HashSet (toute collection qui fait utiliser hashCode() ), ou quelque chose qui a besoin de vérifier l'objet d'égalité (c'est à dire HashSet de la méthode contains ()). Sinon, il travaillera de manière incorrecte, si c'est ce que vous demandez.

Il est assez facile de faire votre propre mise en œuvre de ces méthodes grâce à HashCodeBuilder et EqualsBuilder de Apache Commons Lang.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X