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 à fonctionnera? Comment la valeur par défaut hashCode qui fonctionne et ce qui sera de retour? == va juste 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?
Vous devez vous connecter pour publier un commentaire.
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 documentation:
equals
hashCode
De
Objet
dans un de la JVM implémentations:Dans les deux cas, c'est juste en comparant les adresses de la mémoire des objets en question.
v6u23 ea
:public native int hashCode();
Il y a des implémentations par défaut de
equals()
ethashCode()
dans l'Objet. Si vous n'avez pas à fournir votre propre mise en œuvre, ceux-ci seront utilisés. Pourequals()
, cela signifie une==
comparaison: les objets ne seront égales si elles sont exactement le même objet. PourhashCode()
, le Javadoc a une bonne explication.Pour plus d'informations, voir Efficace Java, Chapitre 3 (pdf), point 8.
Oui, à partir de
Object
classe depuis votre classe étend Objet implicitement.equals
retourne simplementthis == obj
.hashCode
mise en œuvre est originaire. Juste une supposition - il retourne le pointeur vers l'objet.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.
Foo
etBar
sont des références à deux instances différentes d'un mutable type, et il existe une méthode (par exemple,SomeMutatingMethod
) tels queFoo.SomeMutatingMethod()
n'affecte pasBar
la même manière qu'il neFoo
, cette différence devrait être suffisant pour considérer les objets comme inégales.IBM developerworks dit:
Toutefois, pour être sûr de l'exacte des détails de l'implémentation d'un fournisseur spécifique à la version Java, il est probablement préférable de regarder en tant que source (si elle est disponible)