Gleichheit von Objekten
Wenden wir uns nun der Frage zu, wann sich zwei Objekte gleichen.
Alle Objekte bieten die equals(Object)-Methode an, mit deren Hilfe festgestellt wird, ob zwei Objekte gleich sind. Equals greift auf die Methode hashCode() der beiden Objekte zurück und vergleicht sie; etwa:
public boolean equals(Object obj) {
return this.hashCode()==obj.hashCode();
}
HashCode wiederum erzeugt eine Repräsentanz des Objekts als Integer-Wert. In der Basisimplementierung der Klasse Object geschieht das durch Auslesen der Speicherstelle im Arbeitsspeicher. Equals liefert daher und immer nur dann true, wenn die Objekte identisch sind.
Oft ist das nicht gewünscht. Beispielsweise wäre könnte es in einigen Fällen gewünscht sein, wenn equals "true" lieferte, wenn alle Felder zweier Objekte gleich sind. Es ist daher häufig erforderlich, equals und auch hashCode zu überschreiben, um die Gleichheit zweier Objekte anhand ihrer Felder festzustellt. Das folgende Beispiel verdeutlicht den Zusammenhang:
Der Vergleich der ShowEquals-Objekte liefert false, da die Methoden der Basisklasse Object aufgerufen werden, die auf Identität prüfen. Das schlägt aber fehl, weil es zwei unterschiedliche Objekte sind, die jeweils mit „new“ erzeugt wurden.
Im Fall der Klasse ShowEqualsTrue sind die hashCode und equals–Methoden in einer Weise überschrieben, dass Sie die Daten der Objekte für den Vergleich nutzen. Da beide Objekte dieselben Datenhaben, liefert der Vergleich „true“.
Die Objektidentität lässt sich dann mit dem Vergleichsoperator „==“ feststellen.