HashSet erlaubt Duplikate

7

Ich kann nicht scheinen, dass eine HashSet -Instanz wie erwartet funktioniert. Der Code, den ich verwendet habe, ist wie folgt:

%Vor%

Unterklasse

%Vor%

Dieser Code gibt

aus %Vor%     
Sheldon Ross 02.11.2009, 20:31
quelle

6 Antworten

20

Sie müssen equals(Object) überschreiben. Stattdessen haben Sie eine equals -Methode mit der Signatur equals(Subclass) implementiert. Folglich verwendet Ihre HashSet die Standardmethode equals(Object) , die für das Testen der Gleichheit in Object definiert wurde.

Die standardmäßige equals(Object) -Implementierung basiert auf der Objektidentität und daher erlaubt die Menge "erlaubt", zwei String s hinzuzufügen, die, obwohl sie semantisch gleich sind, nicht das gleiche Objekt sind.

    
Adamski 02.11.2009, 20:36
quelle
5

Sie haben Object.equals() nicht korrekt überschrieben.

%Vor%

Die Methode boolean equals(Subclass other) erstellt eine zweite Methode, die nicht Ihrer Absicht entspricht.

    
Bombe 02.11.2009 20:37
quelle
3

Zwei Meta-Punkte:

Erstens, gewöhnen Sie sich an, @Override jedes Mal zu verwenden, wenn Sie glauben, dass Sie eine Methode außer Kraft setzen. Das hätte dazu geführt, dass Ihr Beispielcode nicht kompiliert werden konnte und Sie das Problem entdecken.

Zweitens, wenn Sie eine IDE verwenden und eine schöne, fette Warnung für Sie nicht hervorgehoben hat, ist sie falsch konfiguriert! Du solltest es reparieren!

Und wenn Sie keine IDE verwenden, sollten Sie wirklich, wirklich sein. Sobald Sie public boolean equals(Subclass other) eingegeben haben, würde der Text seine Farbe ändern und eine Warnung würde angezeigt werden, die Ihnen sagt, was Ihr wahrscheinliches Problem ist.

Übrigens ist das Standardidiom für equals() , auf das ich mich eingelassen habe, folgendes:

%Vor%

In einigen -Fällen lohnt es sich, ein if (object == this) { return true; } voranzustellen, aber es ist wirklich nicht sinnvoll, sich regelmäßig daran zu gewöhnen.

    
Kevin Bourrillion 04.11.2009 01:03
quelle
1

Ich hatte fast das gleiche Problem, da alle sagten, dass Sie die richtige Methode public boolean equals(Object o) überschreiben müssen. Aber das ist nicht genug!

Es ist auch notwendig, public int hashCode() zu überschreiben (wie Sie es getan haben), andernfalls würde java die Methode equals überhaupt nicht aufrufen.

    
Abbas 06.09.2012 19:21
quelle
0

Erstens, es sieht so aus, als ob Ihr equals(Subclass other) equals(Object other) sein müsste, um die Methode java.lang.Object.equals() nach Wunsch zu überschreiben. Wahrscheinlich ruft die Menge die zugrunde liegende equals() Implementierung auf.

    
andersoj 02.11.2009 20:38
quelle
0

Ihre equals-Methode wird nie aufgerufen. Die Signatur von equals erfordert, dass es ein Object braucht, nicht irgendeine andere Klasse (einschließlich der Klasse, die zufällig equals implementiert).

%Vor%     
Jonathan Feinberg 02.11.2009 20:40
quelle

Tags und Links