11
votes

Java Hashcode basé sur l'identité

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: xxx

idées?


4 commentaires

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.


3 Réponses :


26
votes

Système .IdentityHashCode (objet) fournit ce comportement.

Vous écririez ceci: p>

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


0 commentaires

9
votes

Utilisez system.identitityhashcode ( ) . C'est ce que IdentityHashMap utilise.

Vous devriez être extrêmement de remplacer un hashcode () avec ceci, car vous risquez de casser le contrat HashCode, étant donné que deux objets suivants:

Si A.Equals (B), alors A.HashCode () doit être égal à B.HashCode ()

Vous pouvez casser cela en remplaçant le comportement existant ou vous devrez peut-être trop remplacer () aussi.


0 commentaires

1
votes

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;


0 commentaires