Wie funktioniert in Java die "equals"-Methode?
Habe schon ein wenig im Internet darüber gelesen, aber verstehe es nicht so richtig. Ich frage mich, wozu man das braucht, wenn man einfach z.B. a==b schreiben kann.
4 Antworten
Hey,
== und .equals machen zwei komplett unterschiedliche Dinge.
== vergleicht Referenzen und primitive Datentypen miteinander.
.euquals vergleicht zwei Objekte auf Gleichheit.
Hier ein Beispiel:
System.out.println(5 == 5); // true (da primitiver Datentyp: direkter Vergleich);
String a = new String("lala");
String b = a;
System.out.println(a == b); //true (da gleiche Referenz)
String x = new String("lele");
String y = new String("lele");
System.out.println(x == y); // false (da nicht gleiche Referenz)
System.out.println(x.equals(y)); // true (da identisch)
Mfg Jannick (L1nd)
Mit == vergleicht man primitive Datentypen (byte, short, int, long, float, double, char, boolean)
Mit .equals() vergleicht man Objekte (also Strings, oder Instanzen irgendwelcher Klassen)
Falls du eine Erklärung willst:
== schaut einfach nur, ob beide Variablen den selben Wert beinhalten. Bei Zahlen ist das der Fall, da zeigt die Variable direkt auf einen Wert den man vergleichen kann, aber bei Objekten zeigt die Variable auf die Speicher-Adresse des Objekts. Wenn ich zwei Objekte hab, dann stehen da natürlich unterschiedliche Speicheradressen, dementsprechend liefert == bei Objekten ein false zurück. Man kann == also auch Verwenden um Referenzen zu vergleichen, also um zu prüfen ob es das SELBE (nicht nur das gleiche) Objekt ist, aber eben nicht, um zu prüfen, ob zwei Objekte INHALTLICH gleich sind.
Mit equals kann eine eigene Regel definiert werden, wann zwei Objekte gleich sind.
In der Standardimplementation von Java (Object.equals) werden Objekte mittels Vergleichsoperator (==) verglichen. Dieser Operator prüft allerdings, ob zwei Objekte identisch sind, also an der gleichen Stelle im Speicher liegen.
Nun nimm einmal an, du möchtest ein Spiel wie Memory entwickeln. Jede Karte existiert also zweimal. Damit doppelte Karten auch einfach erkannt werden können, könntest du für die Klasse Karte die equals-Implementation neu definieren, sodass zwei Karten als gleich gewertet werden, wenn sie das gleiche Bild zeigen.
Ein weiteres populäres Beispiel ist die Klasse String aus der Standardbibliothek. Ihre equals-Methode überschreibt bereits die Logik ihrer Basisklasse, so dass du mit ihr zwei Strings auf Gleichheit prüfen kannst.
== prüft, ob die beiden Werte exakt gleich sind. Aber was ist ein Wert? Jede Variable mit Ausnahme der 8 primitiven Datentypen (int, long, etc.) ist eine Referenz. Heißt, die Variable speichert kein Objekt sondern einfach nur die Adresse eines Objektes. Verglichen wird also in Wahrheit nur, ob die beiden Adressen gleich sind. Sobald du etwas vergleich willst, das kein primitiver Datentyp ist, macht == in 99 % der Fälle nicht, was du willst. Dafür ist .equals da. equals ist eine Methode der Klasse Object. Jede Klasse erbt von Object, heißt jede Klasse hat die equals Methode. Je nach dem, was es nun für eine Klasse bedeuten soll, dass zwei Objekte gleich sind, kann man beliebig Bedingungen in die equals Methode der Klasse schreiben. equals macht also einfach nur, was ihm gesagt wurde. (Object prüft einfach nur für == zum Beispiel). Man kann davon ausgehen, dass alle Objekte der Standardbibliothek eine sinnvolle .equals Implementierung besitzen.