ist es eigentlich sehr wichtig die Methode hashCode() in einer Klasse zu implementieren oder kann das auch mal zu Fehlern führen, wenn man sie nicht implementiert? Und was kann passieren, wenn die Methode compareTo() nicht mit equals() übereinstimmt?
Über eine Antwort würde ich mich sehr freuen ???:L
Ich habe den hashCode noch nie gebraucht aber es kann sein, dass ich dafür von den Profis gelyncht werde.
Warum sollte compareTo mit equals übereinstimmen? Dann hättest du zweimal dieselbe Methode unter unterschiedlichem Namen.
Das kommt häufig vor das man equals und hashcode überschreiben muss. Beispiel:
Java:
importjava.util.HashSet;publicclassHashEquals{staticclassPerson{privateString name;publicPerson(String name ){this.name = name;}}publicstaticvoidmain(String[] args ){finalHashSet<Person> set =newHashSet<Person>();
set.add(newPerson("Max Mustermann"));System.out.println( set.contains(newPerson("Max Mustermann")));}}
Obwohl ich Max Mustermann in mein HashSet (Menge) hinzugefügt habe sagt die contains Methode, dass Max Mustermann nicht in dem HashSet enthalten ist. Wenn ich nur die equals Methode korrekt überschreibe liefert mir contains true zurück. Das hat hat das Problem aber noch nicht ganz gelöst. Denn es besteht noch das Problem dass ich Max Mustermann zweimal zum HashSet hinzufügen kann (darf nicht sein, da ein HashSet eine Menge darstellt, und jedes Element in einer Menge nur einmal vorkommen darf). Denn die HashCodes sind noch nicht identisch. Also muss auch hashCode überschrieben werden.
Also es gilt: Wenn equals überschrieben wird sollte auch immer hashcode überschrieben werden. Und zwei gleiche Objekte sollten immer den selben hashcode haben.
Die compareTo Methode gehört zum Interface Comparable. Dieses interface wird verwendet um z.B. eine Liste von Objekte zu sortieren. Das hat also nicht wirklich was mit equals zu tun. Wobei es aber durchaus schön wäre wenn compareTo 0 zurück gibt bei zwei gleichen Objekten, da man zwei gleiche Objekte bei einer Sortierung i.d.R nebeneinander stehen haben möchte.
Als kleine Ergänzung zu der Erklärung von Enceladus271:
Es ist im Gegenzug aber durchaus legitim, dass compareTo() 0 zurück gibt, auch wenn die Objekte laut equals nicht gleich sind. Um beim Beispiel Person zu bleiben: Z.B. vergleicht compareTo() hier nur anhand von Name und Geburtsdatum, lässt Gewicht und Wohnort aber außen vor..