Le comportement par défaut de l'objet.hashcode () est de renvoyer essentiellement l'adresse de l'objet afin que A.HashCode () == b.Hashcode () si et seulement si A == b. Comment puis-je obtenir ce comportement dans une classe définie par l'utilisateur si une superclasse définit déjà HashCode ()? Par exemple: idées? P> p>
3 Réponses :
Système .IdentityHashCode (objet) fournit ce comportement.
Vous écririez ceci: p>
public boolean equals(Object other){ return this == other; }
Utilisez system.identitityhashcode ( ) code>
. C'est ce que IdentityHashMap code>
utilise. P>
Vous devriez être extrêmement strong> de remplacer un Si A.Equals (B), alors A.HashCode () doit être égal à B.HashCode () P>
Vous pouvez casser cela en remplaçant le comportement existant ou vous devrez peut-être trop remplacer () aussi. P> hashcode () code) existant () code> avec ceci, car vous risquez de casser le contrat HashCode, étant donné que deux objets suivants: P>
Comme mnementh le dit tout, j'aimerais simplement souligner que HashCode () retourner 0 (ou toute valeur constante) est valide (en boiteux). hashcode () peut (et devrait) renvoyer des valeurs différentes pour A et B uniquement si! A.Equals (b).
Donc, par exemple, vous avez
if (super.equals(o)) return true;
Non ce n'est pas le cas. C'est pour obtenir un code pour que A.Hashcode ()! = B.Hashcode () implique nécessairement que A! = B.
... Mais A.HashCode () == b.Hashcode () n'implique pas A == B, j'aurais dû ajouter.
Si "A.Equals (B)", pas nécessairement "A == B", les codes de hachage doivent être égaux: "A.HashCode () == B.Hashcode ()"
Le contrat est censé être que les aiformiers (b) impliquent () == b.hashcode (), mais a.hashcode () == b.ashcode () n'implique pas que les aifieurs (B) . Ce n'est pas si et seulement-si, c'est une chose à sens unique.