HashSet Methode contains liefert false (hash Methode überschrieben)

julian.veh

Bekanntes Mitglied
Hallo,

direkt noch ein zweites Thema von mir.
Ich habe in einem HashSet verschiedene Formeln und für alle die hash-Methode und natürlich die equals-Methode überschrieben.
Jetzt habe ich ein Objekt, das eigentlich schon im Set enthalten ist. Wenn ich über das gesamte Set iteriere, ergibt die equals Methode beim betroffenen Objekt auch true. Aber die contains Methode liefert false.
Hier ein kurzer Ausschnitt:
Java:
for(RoboFormula form : beliefs) {
            if(form.equals(f) && form.hashCode()==f.hashCode()) System.out.println("Objekt sollte enthalten sein");
        }
       
        boolean contains = beliefs.contains(f);
        if(contains) System.out.println("contains liefert true");
        else System.out.println("contains liefert false");

Die Ausgabe:

"Objekt sollte enthalten sein"
"contains liefert false"

Habe ich etwas vergessen? Muss ich noch etwas tun, außer die hash Methode überschreiben? Vielleicht angeben, dass die überschrieben hashCode Methode genutzt werden soll?

Danke nochmals!
 
equals() und hashCode() müssen zueinander konsistent sein.
Lese: https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()

Wenn du equals(Object) und hashCode() überschreibst, dann werden auch diese überschreibenden Methoden verwendet.
VORSICHT: Die Methodensignatur ist equals(Object) und NICHT equals(MeineEigeneKlasse). Letzteres würde Object.equals(Object) NICHT überschreiben sondern nur überladen.

Ebenfalls wichtig: Der Wert von hashCode() darf sich auch nicht ändern, solange wie sich das Objekt in dem HashSet befindet, da es sonst im falschen "Bucket" liegt.
 
Danke dir nochmal! Hatte nur nicht equals(MeineKlasse) überschrieben. Mit Object ist das Problem nun behoben!
Kann ich meine Themen als erledigt markieren?
 
Immer @Override verwenden, wenn man überschreiben möchte, dann wird man auf so einen Fehler hingewiesen.
 

Neue Themen


Zurück
Oben