2016-05-18 14 views
1

Wenn Sie den Gleichheitsoperator für Objekte zum Vergleichen von Feldern überschreiben, heißt es auch, dass Sie hashCode() überschreiben sollten.Overriding HashCode, wenn dies nicht problematisch wäre?

Ist es jemals der Fall, dass zwei Objekte alle die gleichen Felder aber unterschiedliche hashCodes() hätten? Warum müssen beide aktualisiert werden?

Antwort

2

Das Hauptproblem mit nicht überschreiben beide ist, dass viele Container davon ausgehen, dass beide Methoden die gleiche Strategie verwenden. Die typischen Fälle sind HashMaps. Wenn Sie einen von equals()/hashCode() überschreiben, aber nicht beide (oder sie inkonsistent überschreiben), werden sie wahrscheinlich nicht funktionieren, da sie hashCode() verwenden, um den Bucket zu finden sollte sein, bu dann benutze gleich() um innerhalb dieses Buckets zu suchen. So kann es am Ende nach dem gegebenen Schlüssel im falschen Eimer suchen !. Das ist der Grund, warum Sie manchmal einen Schlüssel nicht finden, wenn Sie ihn erhalten, sondern ihn durch Iterieren über jedes Element finden können: Iterieren verwendet hadhCode() nicht.

Es ist eine ähnliche Argumentation wie, warum sollten Sie nie haben eine hashCode(), die seinen Wert ändert, während das Objekt in einem HashSet/HashMap ist: durch die Zeit, die Sie für Ihr Objekt suchen, hashCode() könnte geändert und Sie in einen falschen Bucket senden.

1

a.equals(b) impliziert, dass map.put(a, c); map.get(b)c ergeben sollte, wo map ist ein Map, a und b Schlüssel sind, und c ist etwas Wert. Insbesondere kann ein HashMap diese Operationen sehr schnell durchführen, verlässt sich jedoch auf a.hashCode() und b.hashCode(), um dies korrekt zu tun. Wenn sie a.hashCode() != b.hashCode() sind, werden sie nicht als gleichwertige Schlüssel erkannt und Programme, die HashMap verwenden, werden sich sehr frustrierend und verwirrend verhalten. Sie sollten immer davon ausgehen, dass dies eine Möglichkeit ist, auch wenn Sie dies im Moment nicht beabsichtigen. Implementieren Sie keines ohne das andere. Es ist auch nicht so schwer zu tun: Ihre IDE kann es wahrscheinlich (und equals) für Sie erzeugen. Andere Datenstrukturen wie HashSet verwenden es auch.