HashSet: Wertgleiche Objekte finden



  • Hallo Forum,

    ich habe ein HashSet Objekt, das Integers enthält. Wenn ich dann aber menge.contains(new Integer(3)) mache, bekomme ich stets false zurück, da das HashSet überprüft, ob der Pointer des neuen Integer Objekts schon enthalten ist, nicht der Wert (3). Wie kann ich denn überhaupt feststellen, ob es im HashSet schon ein Objekt mit dem Wert 3 gibt?? Gibt es da keine Möglichkeit?

    Grüßle,
    Jalina



  • import java.util.*;
    
    class Hashtest {
      public static void main(String args[]){
        HashSet test = new HashSet();
        test.add(new Integer(4));
        System.out.println(test.contains(new Integer(4)));
      }
    }
    

    Hab das mal getestet und bekomme ein true zurück. Daran scheint es nicht zu liegen



  • Hi,
    danke für die Anwort. Ich muss zugeben, ich hab mein Problem wohl zu stark vereinfacht, dein Beispiel funktioniert tatsächlich.
    Folgendes aber nicht. Ich hab ne Klasse Foo:

    static class Foo {
    	int i;
    	String s;
    	Foo(int i, String s) {
    	  this.i = i;
    	  this.s = s;
    	}
    }
    

    Wenn ich dann in main folgendes mache, bekomme ich false ausgegeben:

    HashSet test = new HashSet();
    	Foo f1 = new Foo(4, "four");
    	Foo f2 = new Foo(4, "four");
    	test.add(f1);
    	System.out.println(test.contains(f2));
    

    Ideen? 🙄
    LG, Jalina



  • Anscheint wurde public boolean equals(Objekt o) der KLasse nicht entsprechend überschrieben.

    z.B.:

    public boolean equals(Objekt o){
       if(o instanceof Foo){
             Foo f = (Foo)o;
             return f.name.equals(this.name) && f.nr == this.nr;
        }
        return false;
    }
    
    // am besten auch gleich
    public int hashCode(){
       return this.name.hahCode();
    }
    


  • Korrekt. Du musst dir den Unterschied bewusst machen zwischen Objektidentität und Objektgleichheit. Gleiche Objekte müssen nicht identisch sein (also müssen nicht die selben Objekte sein). Vermutlich benutzt HashSet die equals()-Methode um dein Element zu finden und je nach Art der Objekte kann die Identität ein sinnvoller Test auf Gleichheit sein oder nicht.
    btw. solltest du die Collections generisch benutzen, was dann so aussehen würde:

    HashSet<Foo> set = new HashSet<Foo>();
    

    Wenn das nicht compiliert, brauchst du erst das neue JDK.



  • Vermutlich benutzt HashSet die equals()-Methode um dein Element zu finden und je nach Art der Objekte kann die Identität ein sinnvoller Test auf Gleichheit sein oder nicht.

    Leider nicht. Ich habe die equals() Methode überschrieben, so dass sie stets true zurückgibt => immer noch false 😞



  • Voraussetzung ist natürlich erstmal, dass der Hashcode gleich ist. Wenn die Hashcodes schon nicht gleich sind, wird mit equal gar nicht erst getestet, sonst wäre der Sinn von dem HashSet irgendwie kaputt. 😉
    Du musst also die hashCode()-Methode auch redefinieren.



  • [edit] ### war blödsinn


Anmelden zum Antworten