equals() und hashcode() überschreiben

  • Themenstarter Themenstarter Killit
  • Beginndatum Beginndatum
K

Killit

Gast
Also, wenn ich das richtig verstehe,
muss ich bei eimer Hashmap z.B. das equals und den hashcode selber überschreiben,
sofern die map von Objekten ist die die Bibiliothek nicht kennt.


also z.B.:
Java:
private Map<Person,String> lol = new HashMap<Person,String>();


-> in dem Fall ist ja der "key" ein Typ von Person.

wenn ich jetzt equale() mache ohne equal in der Klasse Person zu überschreiben,
wie vergleicht er dann? Das versteh ich noch nicht so ganz?
Vergleicht er dann den hashcode? oder die value? oder Beides?
wenn ich z.B: habe:
Java:
Person p1 = new Person(10);
Person p2 = new Person (10);
lol.put(p1,"DarthVader");
lol.put(p2,"DarthVader");
was müsste ich abändern, damit das equals z.B. nicht true gibt?
Find ich alles etwas verwirrend.
 
Was da standardmäßig passiert kannst du in den Javadocs nachlesen: [JAPI]Object[/JAPI]
Und dein beispiel sollte false zurückliefern, wenn du nichts machst. Anderer seits: warum sollen diese Personen sich unterscheiden?
 
Ist sehe in deinem gezeigten Code nirgends ein Equals, also kann auch keines false werden. Oder was meinst du?
Wenn du sicher wissen willst was equals macht, dann überschreib es, so wie es sich gehört.
 
Achso, es liefert false, und deswegen muss ich überschreiben, damit er da dann true zurückliefert, da das Objekt mit Namen "Dieter" ja schon vorhanden ist?


btw hab Fehler gemacht und p2 geaddet, des soll natürlich nur so rumlungern
 
Man "muss" erstmal gar nichts, vor allem, wenn man anti-autoritär erzogen worden ist 😀

Wenn man sowas macht wie
Java:
Person p = new Person("Name", 123);

hashMap.put(p, "Test");

System.out.println(hashMap.get(p));
dann findet man auch dort den Wert "Test", wenn man 'p' als Key angibt.

Wenn man equals und hashCode NICHT überschreibt, dann beziehen sich beide auf die Identität des Objektes. Wenn man equals nicht überschreibt ist
personA.equals(personB);
im Prinzip das gleiche wie ein Referenzvergleich
personA == personB;
Das ist also true, wenn es nicht nur das gleiche Objekt ist, sondern wirklich ein-und-dasSELBE.

Wenn es aber zwei Person-Objekte gibt
Java:
Person a = new Person("Name", 123);
Person b = new Person("Name", 123);
Dann sind das zwei Objekte (und NICHT zwei mal dasSELBE). Und üblicherweise sagt man dann: Diese Objekte sollen als "gleich" gelten (weil sie eben genau die gleichen Eigenschaften haben).

Dann kann man equals und hashCode passend überschreiben.

was müsste ich abändern, damit das equals z.B. nicht true gibt?

Nichts. Bei
Code:
Person p1 = new Person(10);
Person p2 = new Person (10);
wird p1.equals(p2) immer 'false' ergeben (außer, wenn 'equals' entsprechend überschrieben wurde).

Man sollte auch immer darauf achten, dass equals und hashCode zueinander passen. Mehr dazu steht in der API-Doku zu 'hashCode'.
 

Zurück
Oben