Was bedeutet "equals überschreiben" in Java und wie macht man das richtig?
- Einführung in die Methode equals()
- Warum sollte man equals() überschreiben?
- Wie überschreibt man equals() korrekt?
- Zusätzliche Hinweise zu hashCode()
- Fazit
Einführung in die Methode equals()
In der Programmiersprache Java ist die Methode equals() Teil der Klasse Object und wird verwendet, um zu überprüfen, ob zwei Objekte inhaltlich gleich sind. Standardmäßig vergleicht die equals()-Methode die Speicheradressen der Objekte, also ob beide Referenzen tatsächlich auf dasselbe Objekt zeigen. Das ist oft nicht ausreichend, wenn man z. B. Objekte mit gleichem Zustand (gleiche Werte der Attribute) als gleich betrachten möchte.
Warum sollte man equals() überschreiben?
Wenn man eigene Klassen definiert, die eigene Datenfelder enthalten, reicht der Standardvergleich von equals() meistens nicht aus, weil dieser nur die Identität der Objekte prüft, nicht deren Inhalt. Wenn man z. B. zwei `Person`-Objekte mit identischem Namen und Alter als gleich betrachten will, muss man die Methode equals() so überschreiben, dass sie diese Felder vergleicht. Ohne Überschreiben würde `person1.equals(person2)` nur dann true zurückgeben, wenn beide Referenzen genau auf das gleiche Objekt zeigen.
Wie überschreibt man equals() korrekt?
Das Überschreiben der Methode equals() erfordert die Berücksichtigung einiger Regeln, damit ihre Funktionsweise konsistent und logisch bleibt:
Zunächst muss die Signatur exakt gleich sein: Die Methode muss public boolean equals(Object obj) heißen, um die Methode der Oberklasse zu überschreiben.
Im Körper der Methode prüft man normalerweise zuerst, ob das übergebene Objekt überhaupt vom richtigen Typ ist oder ob es null ist. Danach vergleicht man die relevanten Eigenschaften der Objekte miteinander.
@Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; Person other = (Person) obj; return this.name.equals(other.name) && this.alter == other.alter; }Hier wird zuerst überprüft, ob die Referenzen identisch sind, dann ob das Objekt nicht null ist und vom selben Typ ist. Anschließend vergleicht man die relevanten Attribute.
Zusätzliche Hinweise zu hashCode()
Wenn man equals() überschreibt, sollte man auch die Methode hashCode() überschreiben. Dies ist wichtig, weil viele Java-Klassen wie HashSet oder HashMap beide Methoden nutzen, um Objekte effizient zu verwalten. Die Regel besagt, dass zwei gleichwertige Objekte (also bei denen equals() true liefert) auch den gleichen Hashcode zurückgeben müssen. Ohne korrektes Überschreiben von hashCode() kann es also zu unerwartetem Verhalten in Collections kommen.
Fazit
Das Überschreiben der Methode equals() ist eine grundlegende Technik in Java, um Vergleiche von Objekten auf deren Inhalt zu ermöglichen. Dabei ist wichtig, konsistent mit hashCode() zu arbeiten und die korrekten Vergleichsregeln zu implementieren. Dadurch kann man sicherstellen, dass Objekte wie gewünscht in Sammlungen und bei Vergleichen funktionieren.
