Dis que j'ai ma propre classe
public class MyObj { /* ... */ }
Il a quelques attributs et méthodes. Il N'implémente PAS equals, N'implémente PAS hashCode.
Une fois que nous appelons equals et hashCode, quelles sont les implémentations par défaut? De la classe Object? Et que sont-ils? Comment la valeur par défaut fonctionnera-t-elle? Comment fonctionnera le hashCode par défaut 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 ()?
v6u23 ea
:public native int hashCode();
Il existe des implémentations par défaut de
equals()
ethashCode()
dans Object. Si vous ne fournissez pas votre propre implémentation, celles-ci seront utilisées. Carequals()
, cela signifie une==
comparaison: les objets ne seront égaux que s'ils sont exactement le même objet. PourhashCode()
, le Javadoc a une bonne explication.Pour plus d'informations, voir Effective Java, Chapitre 3 (pdf), élément 8.
la source
Oui, de la
Object
classe puisque votre classe étend Object implicitement.equals
retourne simplementthis == obj
.hashCode
la mise en œuvre est native. Juste une supposition - il renvoie le pointeur vers l'objet.la source
Si vous ne fournissez pas votre propre implémentation, celle dérivée d'Object sera utilisée. C'est OK, sauf si vous prévoyez de mettre vos instances de classe dans ie HashSet (toute collection qui utilise réellement hashCode ()), ou quelque chose qui a besoin de vérifier l'égalité de l'objet (c'est-à-dire la méthode contains () de HashSet). 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 .
la source
Foo
etBar
sont des références à deux instances différentes d'un type mutable, et qu'il existe une méthode (par exempleSomeMutatingMethod
) quiFoo.SomeMutatingMethod()
n'affecte pas deBar
la même manière qu'elle le faitFoo
, cette différence devrait être suffisante pour considérer les objets comme inégaux.IBM DeveloperWorks dit:
Cependant, pour être sûr des détails d'implémentation exacts pour la version Java d'un fournisseur particulier, il est probablement préférable de rechercher la source (si elle est disponible)
la source